go backsqlschool blogs list

Row Overflow Pages

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

Ημερομηνία: 06 October 2016 01:22
Αξιολόγηση: ( 2 )
Κατηγορίες:
Share it:

Αφήστε το σχόλιο σας - Leave your comment

Τα σχόλια έχουν κλείσει.
Επιτρέπονται μόνο τα σχόλια από τα μέλη του SqlSchool.gr.


newsletter subscription

Εάν επιθυμείτε να λαμβάνετε ενημέρωση από εμάς, δώστε μας το e-mail σας.
PASS chapter logo
Official Professional Association for SQL Server (PASS) chapter for Greece
Join to PASS