sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Row Overflow Pages

Antonios Chatzipavlis
Thursday 06 October 2016

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

Κάποια στιγμή κατά την διάρκεια του μαθήματος η κουβέντα μας είχε φτάσει στα 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 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

Get Certified: Become a Fabric Data Engineer

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.