sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Database Page Internals

Antonios Chatzipavlis
Saturday 02 July 2016

Κάτι για το οποίο καθημερινά μάχομαι είναι το να μάθει ο καθένας που ασχολείται με τον 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 Chatzipavlis is a highly experienced Data Solutions Consultant and Trainer. He has been working in the IT industry since 1988, holding various roles such as senior developer, IT Manager, Data & AI Solutions Architect and Consultant.

Since 1995, Antonios has focused on modern technologies and software development tools, primarily by Microsoft. He has specialized in Data & AI since 2000, with expertise in Microsoft Data Platform (SQL Server, Azure SQL Databases, Azure Synapse Analytics, Microsoft Fabric, Power BI, AI) and Databricks.

Antonios is also a Microsoft Certified Trainer (MCT) for over 25 years, has been recognized as a Microsoft Most Valuable Professional (MVP) in Data Platform since 2010 and he is in the Data Expert 40 Powerlist 2024 by Boussias. He is the co-founder and visionary behind XLYTiCA, a company dedicated to Data & AI solutions.

Episode

Task Flows in Microsoft Fabric

image

More Episodes...

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-2025 All rights reserved

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