go backarticles

Articles of SQLschool.gr Team

Database Page Internals

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


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.


Relative Articles

Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

About us Contact us Terms of Use Privacy Sing in Register
sql school greece logo
© 2010-2020 All rights reserved

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