Κάτι για το οποίο καθημερινά μάχομαι είναι το να μάθει ο καθένας που ασχολείται με τον SQL Server τα βασικά που αφορούν την εσωτερική αρχιτεκτονική του SQL Server και της κάθε database.
Για όλους εμάς που ασχολούμαστε με τον SQL Server η συγκεκριμένη γνώση είναι απαραίτητη καθώς μας βοηθάει στο να κατανοήσουμε τι ακριβώς συμβαίνει σε κάθε δύσκολη στιγμή που μπορεί να συμβεί.
Η κατοχή της συγκεκριμένης γνώσης είναι αυτή που προσδίδει σε αυτόν που την έχει την διαφοροποίηση σε σχέση με όσους λένε ότι γνωρίζουν ή ασχολούνται με τον SQL Server καθώς είναι μακράν καλύτερος τους σε θέματα αντιμετώπισης προβλημάτων και σχεδιασμού των databases.
Σε αυτό το άρθρο θα ξεκινήσουμε από το θεμέλιο λίθο που δεν είναι άλλο από το/τα data page(s).
Όπως τόσες φορές έχω αναφέρει στα άρθρα μου στο SQLschool.gr κάθε database αποτελείτε από data & log files. Κάθε data file είναι χωρισμένο/δομημένο σε pages και κάθε τέτοιο page έχει μέγεθος 8ΚΒ ήτοι 8.192 bytes, και όλα έχουν τον ίδιο μέγεθος δηλαδή δεν υπάρχουν διαφορετικά μεγέθη αν περίπτωση.
Σε κάθε page (εκτός από τα memory optimized tables) αποθηκεύονται όλα τα δεδομένα της database.
Το κάθε page είναι το μικρότερο επίπεδο I/O και είναι η βασική μονάδα μέτρησης για αυτό.
Όπως αναφέρθηκε και παραπάνω κάθε data file έχει N αριθμό από pages ο οποίος αριθμός εξαρτάται από το μέγεθος του data file. Κάθε σε page σε αυτό έχει ένα αριθμό που ξεκινάει από το 0 έως Ν.
Η αναφορά σε κάθε σελίδα γίνεται με το ID του data file και τον παραπάνω αριθμό. Αυτό γίνεται διότι μπορεί σε μια database να έχω περισσότερα από ένα data files όπου κάθε data file έχει ένα μοναδικό ID και το οποίο μπορεί ο καθένας να βρει απλά ρωτώντας το sys.database_files system view υπάρχει σε κάθε database, αλλά η αρίθμηση των pages ξεκινάει σε κάθε ένα πάντα από 0 το Ν.
Όταν μεγαλώνουμε το μέγεθος ενός data file κατά Χ τότε μεγαλώνει και αριθμός των pages και η αρίθμηση είναι από το τελευταίο και συνεχίζει μονότονα αυξανόμενη.
Στο SQL Server υπάρχουν εννέα διαφορετικά data pages types τα οποία είναι:
Page Type | Χρήση |
DATA | Χρησιμοποιούνται για την αποθήκευση των εγγραφών για όλα τα data types εκτός από τα text, ntext, image, nvachar(max), varchar(max), varbinary(max), xml |
ROW OVERFLOW | Χρησιμοποιούνται για την αποθήκευση των δεδομένων τα οποία ξεπερνάνε σε μέγεθος εγγραφής τα 8060 bytes που είναι ο μέγιστος αριθμός των bytes που μπορεί να έχει ένα record στην σελίδα |
LOB | Χρησιμοποιούνται για τα object types όπως text, ntext, image, nvarchar(max), varchar(max), varbinary(max), xml. Επίσης χρησιμοποιούνται και για τα varchar, nvarchar, varbinary, sqlvariant στην περίπτωση που η εγγραφή ξεπερνάει τα 8060 bytes |
INDEX | Χρησιμοποιούνται για τους indexes (όλη η δομή τους) |
GLOBAL ALLOCATION MAP | Παρέχουν πληροφορίες για τα χρησιμοποιημένα extents |
PAGE FREE SPACE | Παρέχουν πληροφορίες για το data file που αφορούν page allocation και free space σε αυτές |
INDEX ALLOCATION MAP | Παρέχουν πληροφορίες σχετικά με τα extents που χρησιμοποιούνται από κάποιο table ή index |
DIFFERENTIAL CHANGED MAP | Παρέχουν πληροφορίες σχετικά με τα extents που έχουν αλλάξει από το τελευταίο full backup |
BULK CHANGED MAP | Παρέχουν πληροφορίες σχετικά με τα extents που έχουν χρησιμοποιηθεί σε minimal logged ή bulk logged operations από το τελευταίο transaction log backup |
Κάποιες από αυτές είναι ειδικές σελίδες μπορείτε να δείτε περισσότερα για αυτές αλλά και για το page structure σε ένα παλαιότερο άρθρο μου
Παρόλα αυτά όμως όλα τα pages ασχέτως του page type έχουν την ίδια βασική δομή η οποία χωρίζει την σελίδα στο header και το body αυτής. Ο header είναι 96 bytes και το body είναι 8096 bytes που στο σύνολο δίνουν τα 8192 bytes που έχει η σελίδα.
Ο Page Header περιέχει πληροφορίες που αφορούν την συγκεκριμένη σελίδα. Κάποιες από αυτές αφορούν πληροφορίες που ο SQL Server χρησιμοποιεί για storage structure consistency κάποιες άλλες αφορούν page navigation.
Τα περιεχόμενα του Page Header είναι τα παρακάτω και μπορεί κάποιος να τα δει αρκεί να χρησιμοποιήσει την DBCC PAGE όπως στο παράδειγμα:
DBCC TRACEON (3604);
DBCC PAGE (master, 1, 1, 0);
DBCC TRACEOFF (3604);
Page Header Field | Χρήση |
PageID | Αποτελείται από το FileID και τον αριθμό του page |
NextPage | Δείχνει την επόμενη σελίδα (FileID & PageID) για το συγκεκριμένο page chain (πχ τα data pages ενός συγκεκριμένου πίνακα). Αν είναι μηδέν τότε σημαίνει ότι δεν υπάρχει επόμενη σελίδα και αυτή είναι η μόνη σελίδα ή έχουμε heap table |
PrevPage | Δείχνει την προηγούμενη σελίδα (FileID & PageID) για το συγκεκριμένο page chain (πχ τα data pages ενός συγκεκριμένου πίνακα). Αν είναι μηδέν τότε σημαίνει ότι δεν υπάρχει επόμενη σελίδα και αυτή είναι η μόνη σελίδα ή έχουμε heap table |
ObjectID | Το id του object στο οποίο ανήκει η συγκεκριμένη σελίδα |
PartitionID | Το id του partition στο οποίο ανήκει η συγκεκριμένη σελίδα |
AllocUnitID | Το id του allocation unit που περιέχει την συγκεκριμένη σελίδα |
LSN | Περιέχει την τιμή του Log Sequence Number που άλλαξε τελευταία φορά την συγκεκριμένη σελίδα |
SlotCnt | Το πλήθος των rows(slots) που περιέχει η σελίδα |
Level | Δείχνει το level στο οποίο η σελίδα ανήκει σε μια δομή index (index tree). Το μηδέν σημαίνει ότι είτε leaf page είτε data page |
IndexID | Το id του index στο οποίο ανήκει η συγκεκριμένη σελίδα. Το μηδέν σημαίνει data page |
FreeData | Δείχνει το σημείο από το οποίο ξεκινάει ο ελεύθερος χώρος της σελίδας. Είναι το byte offset όπως οι γνώστες λένε |
Pminlen | Δείχνει το μικρότερο μηκος ενός data row σε bytes. Βασικά είναι το μέγεθος μόνο των fixed length fields που χρησιμοποιούνται στο row record. |
FreeCnt | Δείχνει το ελεύθερο χώρο που έχει η σελίδα και είναι σε bytes |
reservedCnt | Ο αριθμός των bytes που έχουν δεσμευτεί από όλα τα transactions |
Xactreserved | Ο αριθμός των bytes που έχουν δεσμευτεί από το τελευταίο transaction |
tornBits | Είναι ένα sting of bits το οποίο το κάθε ένα δείχνει αν έχει κάθε τμήμα της σελίδας έχει γραφτεί σωστά στο δίσκο. Χρησιμοποιείται για το page checksum ή το torn page detection |
flagBits | Είναι ένα 2 bytes bitmap το οποίο περιέχει επιπρόσθετες πληροφορίες για την σελίδα. |
Αυτή είναι η αρχιτεκτονική της σελίδας. Αλλά έχουμε πολλά να πούμε ακόμα για αυτές και θα το κάνουμε σύντομα σε επόμενο άρθρο.
//antonch