go backarticles

Articles of SQLschool.gr Team

Row Overflow Pages

Antonios Chatzipavlis

Μου αρέσουν οι μαθητές μου να έχουν περιέργεια και ζητάνε περισσότερα για το τι συμβαίνει πίσω από την σκηνή. Αυτό είναι που με κρατάει ζωντανό στο να κάνω αυτό που κάνω. Την προηγούμενη εβδομάδα είχα ένα τμήμα που είχε αρκετή δόση περιέργειας και έτσι μου δόθηκε η δυνατότητα να μιλήσω αλλά και να δείξω πολλά πράγματα που ξέφευγαν κατά πολύ το επίπεδο του σεμιναρίου και από ότι φάνηκε άρεσε πολύ στους μαθητές μου.

Κάποια στιγμή κατά την διάρκεια του μαθήματος η κουβέντα μας είχε φτάσει στα internals της δομή μιας database και όπως έπρεπε να γίνει έγινε αναφορά και στα row overflow pages. Αυτή τη πληροφορία θέλω να μοιραστώ στο άρθρο αυτό.

Όπως αρκετές φορές έχω γράψει, μιλήσει και δείξει στο παρελθόν τα δεδομένα σε μια database αποθηκεύονται σε 8Κ pages. Το ωφέλιμο μέγεθος που μένει σε κάθε page είναι 8060 bytes το οποίο είναι και το maximum in-row size ανά εγγραφή.

Παρόλα αυτά όμως αυτό ξεπερνιέται όταν στο table υπάρχουν fields που έχουν σαν data type τα varchar, nvarchar, varbinary, sql_variant, CLR user defined type columns και των οποίων το μέγεθος δεν είναι πάνω από 8000 bytes (δεν χρησιμοποιούμε το MAX με απλά λόγια καθώς τότε πάμε σε άλλη δομή αυτή του LOB).

Σημείωση για τα παραδείγματα που ακολουθούν

Το γεγονός ότι χρησιμοποιήθηκε ένα data type αυτό του nvarchar δεν σημαίνει τίποτα περισσότερο από την ευκολία των παραδειγμάτων. Τα ίδια ισχύουν για τα παραπάνω αναγραφόμενα data types και φυσικά των συνδυασμό τους στην δομή ενός table.

Για παράδειγμα εάν έχω το παρακάτω table το row size για αυτόν είναι 2017 bytes και δεν πρόκειται να χρησιμοποιηθεί το row overflow


CREATE TABLE [dbo].[T1](
    [COL1] [int] NOT NULL,
    [COL2] [nvarchar](1000) NOT NULL
) 

Σε κάθε data page του table αυτού αν τα fields είναι πλήρως γεμάτα χωράνε 3 rows, αλλιώς ανάλογα με το μέγεθος τoυ COL2 field μπορεί να έχω περισσότερα rows per page.

Ακόμα σε ένα table όπως το παρακάτω του οποίου το row size είναι 8023 bytes δεν πρόκειται να χρησιμοποιηθεί το row overflow και σε κάθε data page αν τα fields είναι πλήρως γεμάτα έχω ένα row per page αλλιώς μπορεί να έχω περισσότερα


CREATE TABLE [dbo].[T2](
    [COL1] [int] NOT NULL,
    [COL2] [nvarchar](1000) NOT NULL,
    [COL3] [nvarchar](1000) NOT NULL,
    [COL4] [nvarchar](1000) NOT NULL,
    [COL5] [nvarchar](1000) NOT NULL
) 

Σε ένα όμως table όπως το παρακάτω του οποίου το row size είναι 14029 bytes μπορεί να χρησιμοποιηθεί το row overflow page


CREATE TABLE [dbo].[T3](
    [COL1] [int] NOT NULL,
    [COL2] [nvarchar](1000) NOT NULL,
    [COL3] [nvarchar](1000) NOT NULL,
    [COL4] [nvarchar](1000) NOT NULL,
    [COL5] [nvarchar](1000) NOT NULL,
    [COL6] [nvarchar](1000) NOT NULL,
    [COL7] [nvarchar](1000) NOT NULL,
    [COL8] [nvarchar](1000) NOT NULL,
) 

Όπως ανέφερα παραπάνω μπορεί να χρησιμοποιηθεί το row overflow στις περιπτώσεις που το σύνολο των bytes που περνάμε στα fields ενός row είναι πάνω από 8060 bytes. Όσο αυτό παραμένει μικρότερο τότε δεν γίνεται χρήση του row overflow και όταν δεν χωράει το row (ενώ αυτό είναι κάτω από 8060 bytes) στο data page γίνεται απλά το συνηθισμένο page splitting.

Αντίθετα όταν αυτό είναι μεγαλύτερο ανεξάρτητα από το πόσο γεμάτο ή άδειο είναι το data page τότε γίνεται χρήση του row overflow. Σε αυτή την περίπτωση τα fields με το μεγαλύτερο μέγεθος μεταφέρονται στα pages που απαιτούνται για την αποθήκευση των δεδομένων και αυτά τα pages αποτελούν τα row overflow pages πλέον. Το δέσιμο των row overflow pages με το row στο data page γίνεται με την χρήση ενός 24 byte pointer που δείχνει στο overflow page και μπαίνει στο row στο data page.

Στην περίπτωση των updates ακολουθείται η ίδια διαδικασία. Όταν για παράδειγμα ένα row που χώραγε στο data page μεγαλώσει τότε χρησιμοποιείται η παραπάνω τεχνική. Αν αυτό αργότερα αλλάξει ή ήταν ήδη σε overflow page τότε δεν γίνεται χρήση του overflow page.

Τέλος θα πρέπει να γίνεται σαφές ότι ένα row μπορεί να έχει πολλές overflow pages ανάλογα με το πλήθος των variable length fields που έχουν τα παραπάνω αναγραφόμενα data types.

Όλα αυτά είναι καλό να τα γνωρίζει όποιος ασχολείται με τον σχεδιασμό databases σε SQL Server καθώς όπως είναι κατανοητό τα row overflow pages αυξάνουν το IO όταν κάνουμε SELECT queries ιδιαίτερα όταν αυτά περιέχουν sorts, joins καθώς τα row αυτά διαβάζονται σειριακά και σύγχρονα και όχι ασύγχρονα.

Τα row overflow tables είναι κάτι που πρέπει να χρησιμοποιηθεί όταν έχουμε λίγες περιπτώσεις που θα χρησιμοποιήσουν αυτό. Σε κάθε άλλη περίπτωση θα πρέπει να φροντίζουμε να μην ξεπερνάμε το row size των 8060 bytes. Μάλιστα καλό είναι σε αυτές τις περιπτώσεις να κάνουμε το άλμα πίστης και να σπάσουμε τα δεδομένα σε περισσότερους από ένα tables.



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