sqlschool.gr logo

articles

Articles of SQLschool.gr Team

In which pages (data or index) are my table data stored?

Antonios Chatzipavlis
Saturday 10 July 2021

Overview

Η γνώση των internals στο SQL Server όπως πολλές φορές έχω αναφέρει είναι σημαντική γιατί έτσι μπορείς να σχεδιάσεις καλύτερα το database schema, να γράψεις καλύτερα queries ή διαδικασίες και φυσικά να μπορείς να κάνεις καλύτερο troubleshooting.

Σε αυτό το άρθρο θα κατέβουμε για τα καλά το πάτο του βαρελιού καθώς θα κατανοήσουμε το πως ο SQL Server αντιμετωπίζει αυτά που του ζητάμε.

Είμαι σίγουρος ότι αρκετοί θα αναρωτηθούν γιατί γράφω αυτό το άρθρο και ποια είναι η αξία που θα πάρουν από αυτό. Η απάντηση είναι ότι αν το δει κάποιος μεμονωμένα δεν θα βρει μεγάλη αξία αλλά το μυστικό κρύβεται στην σύνδεση με άλλα πράγματα που θέλω να αναπτύξω σε άλλα άρθρα μου στην συνέχεια αλλά δεν θέλω να τα βάλω όλα αυτά μαζί καθώς θα ήταν δύσκολα στην ανάγνωση και στην κατανόηση.

Με αυτά σαν επεξήγηση ας προχωρήσουμε στο θέμα το του άρθρου αυτού.

Είναι γνωστό ότι τα δεδομένα που βάζουμε στα tables αλλά και στους indexes αποθηκεύονται σε 8KB pages και το ερώτημα είναι να βρούμε αυτές που περιέχουν αυτά.

Οι λόγοι που μπορεί να σε οδηγήσουν να αναζητήσεις αυτή την πληροφορία είναι αρχικά μαθησιακοί (για όσους θέλουν να μάθουν σε βάθος την αρχιτεκτονική του SQL Server) αλλά και πρακτικοί καθώς σε δύσκολες περιπτώσεις τόσο corruption αλλά και επίλυσης θεμάτων απόδοσης θέλεις να έχει μια εικόνα που περιέχει λεπτομέρεια τέτοια που να σε βοηθήσουν να λύσεις αυτά.

The undocumented DMF sys.dm_db_databases_page_allocation

Για να μπορέσω να πάρω αυτή την εικόνα υπάρχει ένα undocumented DMF το sys.dm_db_databases_page_allocation.

Αυτό το DMF δέχεται πέντε παραμέτρους:

  • @DatabaseId: Είναι υποχρεωτική παράμετρος και δίνουμε το database ID της database στην οποία θέλουμε να γίνει η εκτέλεση. Μπορούμε να πάρουμε το id αυτό με την χρήση της DB_ID() function
  • @TableId: Δεν είναι υποχρεωτική παράμετρος και στην περίπτωση που περάσουμε το NULL σαν τιμή θα επιστρέψει όλους τους πίνακες που έχουμε στην database και αυτό πραγματικά είναι αργό αλλά και δεν έχει να μας προσφέρει κάτι σαν πληροφορία καθώς όπως είπα πάμε στοχευμένα. Το Table Id για το πίνακα που μας ενδιαφέρει μπορούμε να το πάρουμε με την χρήση της OBJECT_ID() function.
  • @IndexId: Δεν είναι υποχρεωτική παράμετρος και στην περίπτωση που περάσουμε το NULL σαν τιμή θα επιστρέψει πληροφορία για όλους τους indexes. Αν θέλουμε για συγκεκριμένο index μπορούμε να πάρουμε το Index Id από το sys.indexes catalog view.
  • @PartitionId: Δεν είναι υποχρεωτική παράμετρος και στην περίπτωση του NULL σαν input value επιστρέφονται όλα τα partitions.
  • @Mode: Είναι υποχρεωτική παράμετρος και παίρνει δύο τιμές ‘LIMITED’ / ‘DETAILED’. Η πρώτη επιστρέφει λιγότερες πληροφορίες η δεύτερη περισσότερες αλλά χρειάζονται περισσότεροι πόροι για την εκτέλεση της.

ATTENTION
Σε αυτό το σημείο θα πρέπει να επισημάνω ότι η χρήση της συγκεκριμένης DMF έχει αρκετά σημαντικό κόστος σε πόρους αλλά και σε locks και IO και μεγάλες databases (>1TB) παίρνει πολυυυυυυ χρόνο.

Learning by example

Αρχικά ας δημιουργήσουμε μια database και σε αυτή ένα table X, αρχικά σαν heap.

Script-1

create database bindb;
go

use bindb;
go

create table X (col1 int, col2 datetime2(7), col3 char(100));
go

Αν εκτελέσουμε την DMF συνδυαστικά με το sys.indexes catalog view όπως στο παρακάτω query δεν θα έχουμε κάποιο αποτέλεσμα καθώς δεν έχουμε βάλει κάποιο row και είναι γνωστό ότι η δημιουργία ενός table δεν καταλαμβάνει χώρο εκτός από τα απαραίτητα entries που γίνονται στα metadata system objects. Στο σημείο αυτό θα ήθελα να σας προτρέψω να εκτελέσετε και μεμονωμένα το DMF για να δείτε το τι επιστρέφει και το οποίο από τα ονόματα των στηλών είναι εύκολο κανείς να καταλάβει αυτά.

Query-1

select 
         db_name(p.database_id)          as [database_name]
    ,    object_name(p.object_id)        as table_name
    ,    i.[name]                        as index_name
    ,    is_allocated
    ,    allocated_page_file_id          as [file_id]
    ,    allocated_page_page_id          as [page_id]
    ,    page_type_desc
    ,    page_level
    ,    previous_page_page_id           as previous_page_id
    ,    next_page_page_id               as next_page_id
from 
    sys.dm_db_database_page_allocations (
                            db_id()
                        ,   object_id('x')
                        ,   null
                        ,   null
                        ,   'detailed'
                                        ) as p
left outer join sys.indexes i  on i.object_id = p.object_id and i.index_id = p.index_id
order by  table_name , index_name, page_level desc, is_allocated desc, previous_page_page_id

Αν τώρα στο table προσθέσω ένα row και το εκτελέσω ξανά θα δω αποτέλεσμα το οποίο είναι το παρακάτω

Script-2

insert into X values (1,SYSDATETIME(),'a') 
Execution Result of Query-1
database_name table_name index_name is_allocated file_id page_id page_type_desc page_level previous_page_id next_page_id
bindb X 1 1 126 IAM_PAGE 0 0 0
bindb X 1 1 352 DATA_PAGE 0 0 0
bindb X 0 1 353 0 0 0
bindb X 0 1 354 0 0 0
bindb X 0 1 355 0 0 0
bindb X 0 1 356 0 0 0
bindb X 0 1 357 0 0 0
bindb X 0 1 358 0 0 0
bindb X 0 1 359 0 0 0

Αν εξετάσουμε το αποτέλεσμα βλέπουμε ότι η σελίδα 126 έχει δεσμευτεί σαν Index Allocation Map (IAM) και η πρώτη σελίδα που περιέχει δεδομένα είναι η 352.
Επίσης επειδή δεν έχω κάποιο clustered index βλέπω στο index_name column την τιμή null.

Create Clustered Index

Αν τώρα δημιουργήσω ένα clustered index στο col1 column θα δούμε ότι πλέον δεν έχουμε heap και πάλι μπορούμε να εντοπίσουμε τις σελίδες που περιέχουν τα δεδομένα. Αν αναρωτιέστε γιατί δεν είναι οι ίδιες η απάντηση είναι απλή, δημιουργήσαμε ένα clustered index και όπως είναι γνωστό γίνεται αναδιάταξη των δεδομένων.

Script-3

create clustered index cidx on x(col1)
Execution Result of Query-1
database_name table_name index_name is_allocated file_id page_id page_type_desc page_level previous_page_id next_page_id
bindb X cidx 1 1 127 IAM_PAGE 0 0 0
bindb X cidx 1 1 368 DATA_PAGE 0 0 0
bindb X cidx 0 1 369 0 0 0
bindb X cidx 0 1 370 0 0 0
bindb X cidx 0 1 371 0 0 0
bindb X cidx 0 1 372 0 0 0
bindb X cidx 0 1 373 0 0 0
bindb X cidx 0 1 374 0 0 0
bindb X cidx 0 1 375 0 0 0

Create Non-Clustered Index

Αν τώρα φτιάξουμε και ένα nonclustered index στο col2 column έχουμε τα εξής αποτελέσματα στα οποία παρατηρούμε ότι η 126 είναι η IAM του index και έχει μόνο μία σελίδα την 352 που είναι στο leaf level αυτού.

Script-4

create  index idx on x(col2)
Execution Result of Query-1
database_name table_name index_name is_allocated file_id page_id page_type_desc page_level previous_page_id next_page_id
bindb X cidx 1 1 127 IAM_PAGE 0 0 0
bindb X cidx 1 1 368 DATA_PAGE 0 0 0
bindb X cidx 0 1 369 0 0 0
bindb X cidx 0 1 370 0 0 0
bindb X cidx 0 1 371 0 0 0
bindb X cidx 0 1 372 0 0 0
bindb X cidx 0 1 373 0 0 0
bindb X cidx 0 1 374 0 0 0
bindb X cidx 0 1 375 0 0 0
bindb X idx 1 1 126 IAM_PAGE 0 0 0
bindb X idx 1 1 352 INDEX_PAGE 0 0 0
bindb X idx 0 1 353 0 0 0
bindb X idx 0 1 354 0 0 0
bindb X idx 0 1 355 0 0 0
bindb X idx 0 1 356 0 0 0
bindb X idx 0 1 357 0 0 0
bindb X idx 0 1 358 0 0 0
bindb X idx 0 1 359 0 0 0

Adding more rows

Αν βάλουμε 20000 rows στο table αυτό θα δούμε το εξής το παρακάτω αποτέλεσμα από την εκτέλεση του query.
Από το αποτέλεσμα αυτό μπορούμε να καταλάβουμε πολλά που αφορούν την αρχιτεκτονική του SQL Server και ιδιαίτερα για την δομή των indexes.
Για παράδειγμα αν πάρουμε το clustered index (cidx) θα δούμε ότι η σελίδα 127 είναι η IAM όπου στο page_type_desc επιστρέφει DATA_PAGE είναι τα actual data αλλά και το leaf level του clustered index και αυτό το καταλαβαίνουμε από το page_level που είναι μηδέν (και θα δείτε ότι έχουμε πολλά) και τα previous/next page id δείχνουν στην σειρά των pages/data. Επίσης το page_level δείχνει το επόμενο index level που μπορεί αν είναι κάποιο intermediate ή το root index level. Το root index level μπορούμε να το καταλάβουμε από το μεγαλύτερη τιμή που θα δούμε στο page_level αλλά μπορούμε εύκολα να το εντοπίσουμε όταν το page_type_desc είναι INDEX_PAGE και τα previous/next page id είναι NULL

Execution Result of Query-1
database_name table_name index_name is_allocated file_id page_id page_type_desc page_level previous_page_id next_page_id
bindb X cidx 1 1 127 IAM_PAGE 0 0 0
bindb X cidx 1 1 368 DATA_PAGE 0 0 370
bindb X cidx 1 1 369 INDEX_PAGE 1 0 0
bindb X cidx 1 1 370 DATA_PAGE 0 368 371
bindb X cidx 1 1 371 DATA_PAGE 0 370 372
bindb X cidx 1 1 372 DATA_PAGE 0 371 373
bindb X cidx 1 1 373 DATA_PAGE 0 372 374
bindb X cidx 1 1 374 DATA_PAGE 0 373 375
bindb X cidx 1 1 375 DATA_PAGE 0 374 384
bindb X cidx 1 1 384 DATA_PAGE 0 375 385
bindb X cidx 1 1 385 DATA_PAGE 0 384 386
bindb X cidx 1 1 386 DATA_PAGE 0 385 387
bindb X cidx 1 1 387 DATA_PAGE 0 386 388
bindb X cidx 1 1 388 DATA_PAGE 0 387 389
bindb X cidx 1 1 389 DATA_PAGE 0 388 390
bindb X cidx 1 1 390 DATA_PAGE 0 389 391
bindb X cidx 1 1 391 DATA_PAGE 0 390 416
bindb X cidx 1 1 416 DATA_PAGE 0 391 417
bindb X cidx 1 1 417 DATA_PAGE 0 416 418
bindb X cidx 1 1 418 DATA_PAGE 0 417 419
bindb X cidx 1 1 419 DATA_PAGE 0 418 420
bindb X cidx 1 1 420 DATA_PAGE 0 419 421
bindb X cidx 1 1 421 DATA_PAGE 0 420 422
bindb X cidx 1 1 422 DATA_PAGE 0 421 423
bindb X cidx 1 1 423 DATA_PAGE 0 422 432
bindb X cidx 1 1 432 DATA_PAGE 0 423 433
bindb X cidx 1 1 433 DATA_PAGE 0 432 434
bindb X cidx 1 1 434 DATA_PAGE 0 433 435
bindb X cidx 1 1 435 DATA_PAGE 0 434 436
bindb X cidx 1 1 436 DATA_PAGE 0 435 437
bindb X cidx 1 1 437 DATA_PAGE 0 436 438
bindb X cidx 1 1 438 DATA_PAGE 0 437 439
bindb X cidx 1 1 439 DATA_PAGE 0 438 440
bindb X cidx 1 1 440 DATA_PAGE 0 439 441
bindb X cidx 1 1 441 DATA_PAGE 0 440 442
bindb X cidx 1 1 442 DATA_PAGE 0 441 443
bindb X cidx 1 1 443 DATA_PAGE 0 442 444
bindb X cidx 1 1 444 DATA_PAGE 0 443 445
bindb X cidx 1 1 445 DATA_PAGE 0 444 446
bindb X cidx 1 1 446 DATA_PAGE 0 445 447
bindb X cidx 1 1 447 DATA_PAGE 0 446 448
bindb X cidx 1 1 448 DATA_PAGE 0 447 449
bindb X cidx 1 1 449 DATA_PAGE 0 448 450
bindb X cidx 1 1 450 DATA_PAGE 0 449 451
bindb X cidx 1 1 451 DATA_PAGE 0 450 452
bindb X cidx 1 1 452 DATA_PAGE 0 451 453
bindb X cidx 1 1 453 DATA_PAGE 0 452 454
bindb X cidx 1 1 454 DATA_PAGE 0 453 455
bindb X cidx 1 1 455 DATA_PAGE 0 454 456
bindb X cidx 1 1 456 DATA_PAGE 0 455 457
bindb X cidx 1 1 457 DATA_PAGE 0 456 458
bindb X cidx 1 1 458 DATA_PAGE 0 457 459
bindb X cidx 1 1 459 DATA_PAGE 0 458 460
bindb X cidx 1 1 460 DATA_PAGE 0 459 461
bindb X cidx 1 1 461 DATA_PAGE 0 460 462
bindb X cidx 1 1 462 DATA_PAGE 0 461 463
bindb X cidx 1 1 463 DATA_PAGE 0 462 472
bindb X cidx 1 1 472 DATA_PAGE 0 463 473
bindb X cidx 1 1 473 DATA_PAGE 0 472 474
bindb X cidx 1 1 474 DATA_PAGE 0 473 475
bindb X cidx 1 1 475 DATA_PAGE 0 474 476
bindb X cidx 1 1 476 DATA_PAGE 0 475 477
bindb X cidx 1 1 477 DATA_PAGE 0 476 478
bindb X cidx 1 1 478 DATA_PAGE 0 477 479
bindb X cidx 1 1 479 DATA_PAGE 0 478 480
bindb X cidx 1 1 480 DATA_PAGE 0 479 481
bindb X cidx 1 1 481 DATA_PAGE 0 480 482
bindb X cidx 1 1 482 DATA_PAGE 0 481 483
bindb X cidx 1 1 483 DATA_PAGE 0 482 484
bindb X cidx 1 1 484 DATA_PAGE 0 483 485
bindb X cidx 1 1 485 DATA_PAGE 0 484 486
bindb X cidx 1 1 486 DATA_PAGE 0 485 487
bindb X cidx 1 1 487 DATA_PAGE 0 486 488
bindb X cidx 1 1 488 DATA_PAGE 0 487 489
bindb X cidx 1 1 489 DATA_PAGE 0 488 490
bindb X cidx 1 1 490 DATA_PAGE 0 489 491
bindb X cidx 1 1 491 DATA_PAGE 0 490 492
bindb X cidx 1 1 492 DATA_PAGE 0 491 493
bindb X cidx 1 1 493 DATA_PAGE 0 492 494
bindb X cidx 1 1 494 DATA_PAGE 0 493 495
bindb X cidx 1 1 495 DATA_PAGE 0 494 496
bindb X cidx 1 1 496 DATA_PAGE 0 495 497
bindb X cidx 1 1 497 DATA_PAGE 0 496 498
bindb X cidx 1 1 498 DATA_PAGE 0 497 499
bindb X cidx 1 1 499 DATA_PAGE 0 498 500
bindb X cidx 1 1 500 DATA_PAGE 0 499 501
bindb X cidx 1 1 501 DATA_PAGE 0 500 502
bindb X cidx 1 1 502 DATA_PAGE 0 501 503
bindb X cidx 1 1 503 DATA_PAGE 0 502 504
bindb X cidx 1 1 504 DATA_PAGE 0 503 505
bindb X cidx 1 1 505 DATA_PAGE 0 504 506
bindb X cidx 1 1 506 DATA_PAGE 0 505 507
bindb X cidx 1 1 507 DATA_PAGE 0 506 508
bindb X cidx 1 1 508 DATA_PAGE 0 507 509
bindb X cidx 1 1 509 DATA_PAGE 0 508 510
bindb X cidx 1 1 510 DATA_PAGE 0 509 511
bindb X cidx 1 1 511 DATA_PAGE 0 510 512
bindb X cidx 1 1 512 DATA_PAGE 0 511 513
bindb X cidx 1 1 513 DATA_PAGE 0 512 514
bindb X cidx 1 1 514 DATA_PAGE 0 513 515
bindb X cidx 1 1 515 DATA_PAGE 0 514 516
bindb X cidx 1 1 516 DATA_PAGE 0 515 517
bindb X cidx 1 1 517 DATA_PAGE 0 516 518
bindb X cidx 1 1 518 DATA_PAGE 0 517 519
bindb X cidx 1 1 519 DATA_PAGE 0 518 528
bindb X cidx 1 1 528 DATA_PAGE 0 519 529
bindb X cidx 1 1 529 DATA_PAGE 0 528 530
bindb X cidx 1 1 530 DATA_PAGE 0 529 531
bindb X cidx 1 1 531 DATA_PAGE 0 530 532
bindb X cidx 1 1 532 DATA_PAGE 0 531 533
bindb X cidx 1 1 533 DATA_PAGE 0 532 534
bindb X cidx 1 1 534 DATA_PAGE 0 533 535
bindb X cidx 1 1 535 DATA_PAGE 0 534 536
bindb X cidx 1 1 536 DATA_PAGE 0 535 537
bindb X cidx 1 1 537 DATA_PAGE 0 536 538
bindb X cidx 1 1 538 DATA_PAGE 0 537 539
bindb X cidx 1 1 539 DATA_PAGE 0 538 540
bindb X cidx 1 1 540 DATA_PAGE 0 539 541
bindb X cidx 1 1 541 DATA_PAGE 0 540 542
bindb X cidx 1 1 542 DATA_PAGE 0 541 543
bindb X cidx 1 1 543 DATA_PAGE 0 542 544
bindb X cidx 1 1 544 DATA_PAGE 0 543 545
bindb X cidx 1 1 545 DATA_PAGE 0 544 546
bindb X cidx 1 1 546 DATA_PAGE 0 545 547
bindb X cidx 1 1 547 DATA_PAGE 0 546 548
bindb X cidx 1 1 548 DATA_PAGE 0 547 549
bindb X cidx 1 1 549 DATA_PAGE 0 548 550
bindb X cidx 1 1 550 DATA_PAGE 0 549 551
bindb X cidx 1 1 551 DATA_PAGE 0 550 552
bindb X cidx 1 1 552 DATA_PAGE 0 551 553
bindb X cidx 1 1 553 DATA_PAGE 0 552 554
bindb X cidx 1 1 554 DATA_PAGE 0 553 555
bindb X cidx 1 1 555 DATA_PAGE 0 554 556
bindb X cidx 1 1 556 DATA_PAGE 0 555 557
bindb X cidx 1 1 557 DATA_PAGE 0 556 558
bindb X cidx 1 1 558 DATA_PAGE 0 557 559
bindb X cidx 1 1 559 DATA_PAGE 0 558 560
bindb X cidx 1 1 560 DATA_PAGE 0 559 561
bindb X cidx 1 1 561 DATA_PAGE 0 560 562
bindb X cidx 1 1 562 DATA_PAGE 0 561 563
bindb X cidx 1 1 563 DATA_PAGE 0 562 564
bindb X cidx 1 1 564 DATA_PAGE 0 563 565
bindb X cidx 1 1 565 DATA_PAGE 0 564 566
bindb X cidx 1 1 566 DATA_PAGE 0 565 567
bindb X cidx 1 1 567 DATA_PAGE 0 566 568
bindb X cidx 1 1 568 DATA_PAGE 0 567 569
bindb X cidx 1 1 569 DATA_PAGE 0 568 570
bindb X cidx 1 1 570 DATA_PAGE 0 569 571
bindb X cidx 1 1 571 DATA_PAGE 0 570 572
bindb X cidx 1 1 572 DATA_PAGE 0 571 573
bindb X cidx 1 1 573 DATA_PAGE 0 572 574
bindb X cidx 1 1 574 DATA_PAGE 0 573 575
bindb X cidx 1 1 575 DATA_PAGE 0 574 576
bindb X cidx 1 1 576 DATA_PAGE 0 575 577
bindb X cidx 1 1 577 DATA_PAGE 0 576 578
bindb X cidx 1 1 578 DATA_PAGE 0 577 579
bindb X cidx 1 1 579 DATA_PAGE 0 578 580
bindb X cidx 1 1 580 DATA_PAGE 0 579 581
bindb X cidx 1 1 581 DATA_PAGE 0 580 582
bindb X cidx 1 1 582 DATA_PAGE 0 581 583
bindb X cidx 1 1 583 DATA_PAGE 0 582 592
bindb X cidx 1 1 592 DATA_PAGE 0 583 593
bindb X cidx 1 1 593 DATA_PAGE 0 592 594
bindb X cidx 1 1 594 DATA_PAGE 0 593 595
bindb X cidx 1 1 595 DATA_PAGE 0 594 596
bindb X cidx 1 1 596 DATA_PAGE 0 595 597
bindb X cidx 1 1 597 DATA_PAGE 0 596 598
bindb X cidx 1 1 598 DATA_PAGE 0 597 599
bindb X cidx 1 1 599 DATA_PAGE 0 598 0
bindb X idx 1 1 126 IAM_PAGE 0 0 0
bindb X idx 1 1 352 INDEX_PAGE 0 0 354
bindb X idx 1 1 353 INDEX_PAGE 1 0 0
bindb X idx 1 1 354 INDEX_PAGE 0 352 355
bindb X idx 1 1 355 INDEX_PAGE 0 354 356
bindb X idx 1 1 356 INDEX_PAGE 0 355 357
bindb X idx 1 1 357 INDEX_PAGE 0 356 358
bindb X idx 1 1 358 INDEX_PAGE 0 357 359
bindb X idx 1 1 359 INDEX_PAGE 0 358 464
bindb X idx 1 1 464 INDEX_PAGE 0 359 465
bindb X idx 1 1 465 INDEX_PAGE 0 464 466
bindb X idx 1 1 466 INDEX_PAGE 0 465 467
bindb X idx 1 1 467 INDEX_PAGE 0 466 468
bindb X idx 1 1 468 INDEX_PAGE 0 467 469
bindb X idx 1 1 469 INDEX_PAGE 0 468 470
bindb X idx 1 1 470 INDEX_PAGE 0 469 471
bindb X idx 1 1 471 INDEX_PAGE 0 470 520
bindb X idx 1 1 520 INDEX_PAGE 0 471 521
bindb X idx 1 1 521 INDEX_PAGE 0 520 522
bindb X idx 1 1 522 INDEX_PAGE 0 521 523
bindb X idx 1 1 523 INDEX_PAGE 0 522 524
bindb X idx 1 1 524 INDEX_PAGE 0 523 525
bindb X idx 1 1 525 INDEX_PAGE 0 524 526
bindb X idx 1 1 526 INDEX_PAGE 0 525 527
bindb X idx 1 1 527 INDEX_PAGE 0 526 584
bindb X idx 1 1 584 INDEX_PAGE 0 527 585
bindb X idx 1 1 585 INDEX_PAGE 0 584 0
bindb X idx 0 1 586 0 0 0
bindb X idx 0 1 587 0 0 0
bindb X idx 0 1 588 0 0 0
bindb X idx 0 1 589 0 0 0
bindb X idx 0 1 590 0 0 0
bindb X idx 0 1 591 0 0 0

Summary

Είδαμε πως μπορούμε να πάρουμε internals info για το πως λειτουργεί ο SQL Server. Κρατάμε την DMF που δείξαμε παρόλο που είναι undocumented καθώς θα την χρησιμοποιήσουμε σε επόμενα άρθρα.


//Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.

Tip

What's New in SQL Server 2022 - Episodes

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2024 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.