Teo wrote: |
KelMan είπες ότι "Όσο μεγαλύτερο το fragmentation τόσο περισσότερες σελίδες έχεις στα indexes, άρα και όγκο δεδομένων, ακόμα και αν χρησιμοποιείς το 3%-4% των εγγραφών". Έχω μόνο insert - delete (τα select δεν επηρεάζουν) σε 4% του μεγέθους του πίνακα και με δεδομένο ότι ο cluster βάζει εγγραφές ανα ημερομηνία (getdate()),όλες οι εγγραφές δεν μπαίνουν στο τέλος του index ? Σβήνω πάντα τις πολύ παλιές (αφού είναι clustered index by datetime- σβήνονται τα πρώτα φύλλα του δέντρου). Με δεδομένο το παραπάνω fragmentation δεν πιστεύεις ότι πρέπει να πάει και να πάρει backup τις πρώτες και τις τελευταίες pages μόνο (τα πρώτα και τα τελευταία φύλλα του δέντρου)? Έχω λάθος?
Κάθε βράδυ, μετά το backup κάνω και update statistics.... Μήπως φταίει αυτό?
|
|
Χμμμμ... Τα indexes στον SQL Server είναι b-tree data structures, όπερ σημαίνει ότι πρέπει να είναι συνεχώς "balanced" (γι αυτό γίνονται τα page splits και κατεπέκταση το fragmentation, για να αναδιοργανώσει τα indexes). Γι αυτόν τον λόγο δεν είναι απαραίτητο ότι το differential θα κάνει backup μόνο τις πρώτες και τις τελευταίες σελίδες. Επίσης, υπάρχει κι ένας επιπρόσθετος λόγος. Το diff backup δεν παίζει σε επίπεδο σελίδας αλλά σε επίπεδο extent. Αν έστω μία εγγραφή σε μία από τις οκτώ σελίδες που αποτελούν ένα extent αλλάξει, τότε γίνεται backup όλο το extent
Ένας τρόπος να δεις πόσα extents έχουν γίνει flagged για diff backup είναι το DBCC PAGE. Στο βιβλίο της Kalen Delany "Inside SQL Server" μας λέει ότι η 6η σελίδα σε κάθε datafile έχει ένα bitmap του οποίου κάθε bit είναι κι από ένα flag για τα extents που ακολουθούν και δείχνει αν είναι dirty ή όχι. Αυτή η σελίδα ονομάζεται DCM (Differential Changed Map) και επαναλαμβάνεται κάθε 511.232 σελίδες για τα επόμενα extents, κοκ.
Παίζουμε στη Northwind. Ανοίγεις το Query Analyser και:
Αρχικά, κάνεις full backup. Θα σου εμφανίσει ένα μήνυμα του τύπου:
Processed 448 pages for database 'Northwind', file 'Northwind' on file 4.
Processed 2 pages for database 'Northwind', file 'Northwind_log' on file 4.
BACKUP DATABASE successfully processed 450 pages in 1.300 seconds (2.831 MB/sec).
Δηλαδή έκανε backup περίπου 56 extents. Κατόπιν, τρέξε το παρακάτω:
DBCC TRACEON (3604)
GO
DBCC PAGE('Northwind',1,6,3) WITH TABLERESULTS
GO
Το DBCC TRACEON (3604) γυρίζει το output του DBCC PAGE στην κονσόλα. To αποτέλεσμα του DBCC PAGE δίνει τα παρακάτω αποτελέσματα ()εμφανίζονται στο τέλος):
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:0) - (1:16) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:24) - (1:56) NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:64) - (1:88) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:96) - (1:528) NOT CHANGED
Δηλαδή έχουμε 2 extents changed κατόπιν 4 not changed, κατόπιν 3 changed και τέλος 54 not changed. Στη συνέχεια, τρέχουμε κάτι σαν το παρακάτω:
SELECT 'DBCC DBREINDEX('''+TABLE_NAME+''','''', 80)'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
του οποίου χρησιμοποιούμε το οutput για να τρέξουμε DBCC DBREINDEX σε όλους τους πίνακες. Μόλις τελειώσει, ξαναδίνεις το DBCC PAGE
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:0) - (1:16) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:24) - (1:32) NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:40) - CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:48) - (1:56) NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:64) - (1:88) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:96) - NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:104) - (1:144) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:152) - (1:160) NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:168) - CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:176) - (1:184) NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:192) - (1:200) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:208) - NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:216) - CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:224) - (1:232) NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:240) - (1:272) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:280) - NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:288) - (1:496) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:504) - NOT CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:512) - (1:520) CHANGED
DIFF_MAP: Hea..., Offset 96 DIFF_MAP: Extent A... (1:528) - NOT CHANGED
Βλέπουμε ότι τώρα έχουμε 45 extents μαρκαρισμένα για diff backup - εκεί που είχαμε 5, και όλα αυτά χωρίς κανένα update operation. Κανονικά, όταν θα κάνεις τώρα το diff backup θα πρέπει το mini report που βγάζει να επιβεβαιώνει τα παραπάνω.
Μπορείς να κάνεις το ίδιο για να δεις τι γίνεται και με τo index defrag. Επίσης, αν τρέξεις το DBCC PAGE πριν το index defrag θα δεις αν όντως είναι μόνο τα πρώτα και τα τελευταία extents που επηρεάζονται.
Πάντως το καλύτερο που έχεις να κάνεις είναι να ρυθμίσεις το fill factor στα indexes έτσι ώστε να έχουν αρκετό ελεύθερο χώρο για να μην προκύπτει fragmentation. Έτσι, δεν θα είναι ανάγκη να κάνεις κάθε φορά rebuild/defrag τα indexes. Επίσης, δες και την περίπτωση να γυρίσεις τη βάση σε bulk-logged recovery model ώστε να κάνεις log file backups.
Vir prudens non contra ventum mingit