go backsqlschool blogs list

Database Page Internals

by Antonios Chatzipavlis

Κάτι για το οποίο καθημερινά μάχομαι είναι το να μάθει ο καθένας που ασχολείται με τον 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*/
Ημερομηνία: 02 July 2016 23:59
Αξιολόγηση: ( 1 )
Κατηγορίες:
Share it:

Αφήστε το σχόλιο σας - Leave your comment

Τα σχόλια έχουν κλείσει.
Επιτρέπονται μόνο τα σχόλια από τα μέλη του SqlSchool.gr.


newsletter subscription

Εάν επιθυμείτε να λαμβάνετε ενημέρωση από εμάς, δώστε μας το e-mail σας.
PASS chapter logo
Official Professional Association for SQL Server (PASS) chapter for Greece
Join to PASS