Διαβάζοντας διάφορα άρθρα διαπίστωσα ότι έχω πολύ καιρό να γράψω κάτι για τα internals του SQL Server και αυτό γιατί σε αρκετά από αυτά είδα ότι για να γίνουν κατανοητά θα πρέπει να έχουν εξηγηθεί κάποια internal objects και ειδικά pages. Με αφορμή αυτό αποφάσισα να γράψω το post αυτό και να αναφερθώ σε όλα αυτά το special pages.
Page structure and page offset
Πριν ξεκινήσω όμως την αναφορά μου σε αυτά θα πρέπει να είμαι σίγουρος ότι όλοι γνωρίζουμε ότι κάθε data file σε μια SQL Server database δομείτε εσωτερικά σε pages των 8ΚΒ. Σε αυτά αποθηκεύονται τα δεδομένα του SQL Server. Ένα page έχει τον page header που είναι 96 bytes και το offset array το οποίο βρίσκεται στο τέλος του page, είναι 36 bytes και παρέχει τους δείκτες (pointers) στο byte location της αρχής της κάθε γραμμής (record) που είναι στην συγκεκριμένη σελίδα.
Αυτό είναι αποθηκευμένο αντίστροφα πάνω στην σελίδα δηλαδή το offset του πρώτου record είναι στο τέλος του συγκεκριμένου array το δεύτερο είναι προτελευταίο κ.ο.κ.
Το υπόλοιπο τμήμα (8060 bytes) είναι ο χώρος στον οποίο αποθηκεύονται τα records. Αυτός είναι και ο λόγος που λέμε ότι το max record length δεν μπορεί να είναι πάνω από 8060 bytes καθώς ένα record δεν μπορεί να είναι σπασμένο σε δύο pages.
Extents
Κάθε 8 τέτοιες σελίδες φτιάχνουν ένα extent. Υπάρχουν δύο είδη extent
Τα mixed extents είναι αυτά όπου οι σελίδες τους είναι καταλυμένες από διαφορετικά αντικείμενα (tables, indexes)
Ενώ uniform είναι αυτά όπου όλες οι σελίδες τους είναι καταλυμένες από το ίδιο αντικείμενο.
Σε κάθε αντικείμενο στον SQL Server οι πρώτες 8 σελίδες είναι σε ένα η περισσότερα mixed extents και μετά αρχίζει να χρησιμοποιεί uniform extents.
Data File Pages
Ας έρθουμε όμως στο προκείμενο του συγκεκριμένου post. Σε κάθε data file υπάρχουν κάποιες σελίδες που είναι στην αρχή του αρχείου. Καταλαμβάνουν δηλαδή τις πρώτες σελίδες σε αυτό όπως βλέπουμε στην παρακάτω εικόνα
File Header Page (Page 0)
Είναι η πρώτη σελίδα σε κάθε data file που έχουμε στην βάση μας και έχει πάντα τον αριθμό μηδέν (0). Περιέχει metadata για το database file όπως FileID, FilegroupID, Current size, Max file size, Sector Size, LSN Information κ.α
Page Free Space Page (Page 1)
Για να μπορεί γρήγορα να βρεθεί ο ελεύθερος χώρος που υπάρχει στο εκάστοτε data file κατά την στιγμή που θα εισάγονται δεδομένα υπάρχει η συγκεκριμένη σελίδα. Μια τέτοια σελίδα μπορεί να ελέγξει 8088 σελίδες και όπως είναι φυσικό αν το data file έχει περισσότερες από τόσες χρειάζονται περισσότερες τέτοιες σελίδες. Η πρώτη πάντως είναι στην θέση 1 (δεύτερη σελίδα στο κάθε data file) ενώ η επόμενη είναι μετά από 8088 σελίδες από την αρχική και η επόμενη μετά από 8088 σελίδες από την προηγούμενη κ.ο.κ. Κάθε byte στην σελίδα αυτή αντιστοιχεί σε μία σελίδα στο data file και περιέχει πληροφορίες τέτοιες ώστε να μαθαίνει γρήγορα το db engine που μπορεί να βάλει δεδομένα είτε αυτά είναι data, indexes ή LOB data. Συγκεκριμένα στο byte αυτό τα bits 0-2 παρέχουν πληροφορίες που δείχνουν τον ελεύθερο χώρο της σελίδας αν είναι ελεύθερη, έως 50% γεμάτη, έως 80% γεμάτη, έως 95% γεμάτη, ως 100% γεμάτη. Το bit 3 δείχνει αν υπάρχουν ghost records, και αυτό χρησιμοποιείται όταν ξεκινάει μια διαδικασία καθαρισμού των ghost records. To bit 4 δείχνει αν αυτή είναι σελίδα IAM. To bit 5 αν είναι mixed page. To bit 6 αν είναι κατειλημμένη.
Global Allocation Map Page (Page 2)
Ο σκοπός της συγκεκριμένης σελίδας είναι να μπορεί να πει αν ένα extent είναι uniform και αν αυτό είναι ελεύθερο ή όχι ώστε να μπορεί να χρησιμοποιηθεί. Σε κάθε αρχείο μπορεί να έχω περισσότερες από μια τέτοιες σελίδες καθώς μια τέτοια σελίδα μπορεί να κρατήσει πληροφορία για 64.000 extents (4GB). Κάθε bit σε αυτή την σελίδα αντιστοιχεί σε ένα extent και η πρώτη τέτοια σελίδα είναι στην θέση 2 δηλαδή στην τρίτη σελίδα του κάθε data file. Αν το bit είναι 0 τότε αυτό το extent είναι δεσμευμένο σαν uniform extent αλλιώς αν είναι 1 είναι διαθέσιμο να γίνει uniform.
Shared Global Allocation Map Page (Page 3)
Ο σκοπός της συγκεκριμένης σελίδας είναι να μπορεί να πει αν ένα extent είναι mixed και αν αυτό είναι ελεύθερο ή όχι ώστε να μπορεί να χρησιμοποιηθεί. Σε κάθε αρχείο μπορεί να έχω περισσότερες από μια τέτοιες σελίδες καθώς μια τέτοια σελίδα μπορεί να κρατήσει πληροφορία για 64.000 extents (4GB). Κάθε bit σε αυτή την σελίδα αντιστοιχεί σε ένα extent και η πρώτη τέτοια σελίδα είναι στην θέση 3 δηλαδή στην τέταρτη σελίδα του κάθε data file. Αν το bit είναι 0 τότε αυτό το extent ή δεν χρησιμοποιείται σαν mixed ή είναι mixed αλλά έχει όλες του τις σελίδες κατειλημμένες. Αν είναι 1 τότε είναι mixed και έχει ελεύθερες σελίδες.
Differential Changed Map Page (Page 6)
H συγκεκριμένη σελίδα χρησιμοποιείται όταν παίρνουμε differential backups. Αντί να ελέγχεται κάθε σελίδα ξεχωριστά ώστε να βρεθούν αυτές που έχουν αλλαγές από το τελευταίο full backup χρησιμοποιείται αυτή η σελίδα όπου στην ουσία καταγράφει αν τα extents, που είναι με την σειρά που υπάρχει στην GAM, έχουν αλλάξει θέτοντας το αντίστοιχο bit που αντιπροσωπεύει το κάθε extent στο bitmap row που υπάρχει σε αυτή την σελίδα σε 1. Κάθε φορά που παίρνουμε full backup αυτό γίνεται πάλι 0. Η πρώτη τέτοια σελίδα βρίσκεται στην θέση 6 του κάθε data file, ενώ οι επόμενες είναι μετά από την εμφάνιση της επόμενης GAM.
Bulk Changed Map Page (Page 7)
Εάν στην database μου έχω BULK_LOGGED recovery model η συγκεκριμένη σελίδα χρησιμοποιείται. Σε αυτή καταγράφονται τα extents, που είναι με την σειρά που υπάρχει στην GAM, που έχουν υποστεί minimal logged operations. Αυτό γίνεται ορίζοντας το αντίστοιχο bit που αντιπροσωπεύει το κάθε extent στο bitmap row που υπάρχει σε αυτή την σελίδα σε 1. Κάθε φορά που παίρνουμε transaction log backup αυτό γίνεται πάλι 0. Η πρώτη τέτοια σελίδα βρίσκεται στην θέση 7 του κάθε data file, ενώ οι επόμενες είναι μετά από την εμφάνιση της επόμενης GAM.
Boot Page (Page 9)
Είναι παρόμοια με την File Header Page παρέχει δηλαδή metadata αλλά για όλη όμως την database και όχι για το data file που παρέχει η File Header Page. Είναι πάντα στην σελίδα 9 και σε κάθε database υπάρχει μία και μόνο μία τέτοια σελίδα η οποία βρίσκετε πάντα στο πρώτο αρχείο την εκάστοτε database. Οι πληροφορίες που αυτή η σελίδα περιέχει είναι η τρέχουσα έκδοση της βάσης, η ημερομηνία δημιουργίας της , το databaseID, το compatibility level και ίσως το πιο χρήσιμο είναι το dbi_dbccLastKnowGood property το οποίο περιέχει την τελευταία ημερομηνία που έχει τρέξει με επιτυχία η DBCC CHECKDB
Other Pages
Οι σελίδες 4 και 5 δεν χρησιμοποιούνται. Φυσικά υπάρχουν και οι γνωστές σελίδες όπως είναι οι data pages, index pages, LOB pages αλλά αυτές είναι σελίδες που δεν μπορούμε να τις χαρακτηρίσουμε σαν ειδικές.
/*antonch*/