sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Database Data File Special Pages

Antonios Chatzipavlis
Saturday 14 July 2012

Διαβάζοντας διάφορα άρθρα διαπίστωσα ότι έχω πολύ καιρό να γράψω κάτι για τα internals του SQL Server και αυτό γιατί σε αρκετά από αυτά είδα ότι για να γίνουν κατανοητά θα πρέπει να έχουν εξηγηθεί κάποια internal objects και ειδικά pages. Με αφορμή αυτό αποφάσισα να γράψω το post αυτό και να αναφερθώ σε όλα αυτά το special pages.

Page structure and page offset

clip_image002Πριν ξεκινήσω όμως την αναφορά μου σε αυτά θα πρέπει να είμαι σίγουρος ότι όλοι γνωρίζουμε ότι κάθε data file σε μια SQL Server database δομείτε εσωτερικά σε pages των 8ΚΒ. Σε αυτά αποθηκεύονται τα δεδομένα του SQL Server. Ένα page έχει τον page header που είναι 96 bytes και το offset array το οποίο βρίσκεται στο τέλος του page, είναι 36 bytes και παρέχει τους δείκτες (pointers) στο byte location της αρχής της κάθε γραμμής (record) που είναι στην συγκεκριμένη σελίδα.

 

clip_image004Αυτό είναι αποθηκευμένο αντίστροφα πάνω στην σελίδα δηλαδή το offset του πρώτου record είναι στο τέλος του συγκεκριμένου array το δεύτερο είναι προτελευταίο κ.ο.κ.

 

 

Το υπόλοιπο τμήμα (8060 bytes) είναι ο χώρος στον οποίο αποθηκεύονται τα records. Αυτός είναι και ο λόγος που λέμε ότι το max record length δεν μπορεί να είναι πάνω από 8060 bytes καθώς ένα record δεν μπορεί να είναι σπασμένο σε δύο pages. 

Extents

Κάθε 8 τέτοιες σελίδες φτιάχνουν ένα extent. Υπάρχουν δύο είδη extent

clip_image006

Τα mixed extents είναι αυτά όπου οι σελίδες τους είναι καταλυμένες από διαφορετικά αντικείμενα (tables, indexes) 

clip_image008

Ενώ uniform είναι αυτά όπου όλες οι σελίδες τους είναι καταλυμένες από το ίδιο αντικείμενο.

Σε κάθε αντικείμενο στον SQL Server οι πρώτες 8 σελίδες είναι σε ένα η περισσότερα mixed extents και μετά αρχίζει να χρησιμοποιεί uniform extents.

Data File Pages

Ας έρθουμε όμως στο προκείμενο του συγκεκριμένου post. Σε κάθε data file υπάρχουν κάποιες σελίδες που είναι στην αρχή του αρχείου. Καταλαμβάνουν δηλαδή τις πρώτες σελίδες σε αυτό όπως βλέπουμε στην παρακάτω εικόνα

clip_image002[11]

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*/

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.

Episode

First look: SQL Database 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-2024 All rights reserved

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