Σε κάθε άνθρωπο που ασχολείται με τον SQL Server είναι γνωστό ότι μια database αποτελείται αρχικά από δύο αρχεία. Το ένα είναι το primary data file και είναι αυτό που έχει το .mdf extension και το transaction log file που είναι αυτό που έχει το .ldf extension.
Επίσης σε κάθε database υπάρχει το primary filegroup στο οποίο by default ανήκει το primary data file. Κάθε data file ανήκει σε ένα και μόνο ένα filegroup. Ένα filegroup μπορεί να έχει περισσότερα από ένα data files. Το ή τα log files δεν ανήκουν σε filegroup. Κάθε database μπορεί να έχει 32.767 filegroups. Τέλος τα filegroups είναι λογικές οντότητες τις οποίες χρησιμοποιεί ο SQL Server σε διάφορες περιπτώσεις.
Δυνητικά μια database μπορεί να φτάσει σε μέγεθος τα 524ΤΒ. Το μέγεθος όμως αυτό δεν μπορεί να συντεθεί από ένα μόνο data file, θα πρέπει να έχω περισσότερα (32.767 is the max number of file per database). Το κάθε data file όμως δεν μπορεί να έχει μέγεθος μεγαλύτερο από 16ΤΒ και το κάθε log δεν μπορεί να είναι μεγαλύτερο από 2ΤΒ.
Όλα τα παραπάνω είναι θεωρώ γνωστά στους περισσότερους και ουσιαστικά στους περισσότερους δεν λένε και τίποτα, ειδικά δε σε αυτούς που έχουν databases που είναι κάτω του TB.
Τι είναι αυτό όμως που με ώθησε να γράψω το άρθρο αυτό;
Αυτό που διαπίστωσα τόσο σαν Consultant όσο και Trainer είναι το γεγονός ότι κανείς μα κανείς δεν δίνει την πρέπουσα προσοχή σε αυτά ώστε να κερδίσει είτε σε performance είστε σε maintenance. Ακόμα και αυτοί που έχουν περισσότερα αρχεία ή filegroups συνήθως το έχουν κάνει γιατί έχουν φτιάξει κάποιο table partitioning που υποχρεωτικά πρέπει να έχουν περισσότερα από ένα filegroups και files.
Με την χρήση περισσοτέρων από ένα data file(s) μπορείς να κερδίσεις τα εξής:
- Μπορείς να κάνεις partial backup.
Ο συνηθισμένος τρόπος για τους περισσότερους είναι να κάνουν full backup σε μια database. Παρόλα αυτά όμως υπάρχει και η δυνατότητα του partial backup που αρκετοί από εμάς εφαρμόζουν σε very large databases. Το partial backup γίνεται σε επίπεδο file/filegroup στο οποίο κατά το σχεδιασμό της database έχουμε τοποθετήσει συγκεκριμένα objects όπως tables ή indexes. Αν και είναι κάπως δύσκολο σας backup σενάριο καθώς απαιτεί και transaction log backup εντούτοις είναι αυτό που επιλέγουμε καθώς μπορούμε να ελαχιστοποιήσουμε τους χρόνους που απαιτούνται για backup.
- Έχεις καλύτερο έλεγχο στο που θα βάλεις κάθε database object και να βελτιώσεις το I/O performance
Όπως αναφέρθηκε και παραπάνω με την χρήση πολλαπλών files/filegroups μπορείς να έχεις έλεγχο στο που μπορείς να βάλεις τα tables/indexes. Με αυτό τον τρόπο μπορείς να μοιράσεις τα φορτία I/O που έχεις από ένα disk/disk array σε περισσότερα disk/disk array.
Ακόμα θα πρέπει να αναφερθεί ότι αν έχω σε ένα filegroup περισσότερα από ένα αρχεία τα οποία αυτά τα έχω σε ξεχωριστό disk/disk array και σε αυτό το filegroup βάλω έναν ή περισσότερους tables τότε θα εκμεταλλευτώ τον round robin algorithm που γίνεται σε επίπεδο extents με αποτέλεσμα να έχω πετύχει έτσι απλά ένα data stripping μεταξύ των disk/disk array στα οποία έχω τοποθετήσει τα data files. Αυτό σημαίνει απλά καλύτερο I/O.
- Μπορείς να βοηθηθείς σε περίπτωση disaster/recovery ή μεταφοράς σε άλλο instance.
Δεν είναι λίγες οι φορές που πρέπει να μεταφέρεις μια βάση από ένα instance σε ένα άλλο instance ή ακόμα και στο ίδιο να αλλάξει το path στο οποίο βρίσκονται τα αρχεία μιας database.
Σε αυτές τις περιπτώσεις αν για παράδειγμα έχεις μια βάση που είναι 2ΤΒ και θέλεις να την μεταφέρεις θα πρέπει να έχεις ελεύθερο χώρο στο δίσκο που θα την μεταφέρεις που να είναι ίσος ή μεγαλύτερος από το μέγεθος των 2ΤΒ. Όμως κάτι τέτοιο δεν είναι πάντα εύκολο, αλλά αν έχεις πχ σε τρεις διαφορετικούς δίσκους συνολικά την χωρητικότητα αυτή (πχ 1ΤΒ στο έναν και από 600 GB στους άλλους δύο) θα μπορούσες να κάνεις την μεταφορά αυτή αν είχες τέσσερα αρχεία των 512GB. Θα πρέπει να το τονιστεί ότι δεν έχουμε κανένα όφελος (αλλά ούτε και μειονέκτημα) αν έχουμε όλα αυτά τα αρχεία στον ίδιο disk/disk array. Το μόνο πραγματικά μεγάλο όφελος που έχουμε είναι ότι μπορούμε να είμαστε περισσότερο ευέλικτοι στις μετακινήσεις των files εφόσον φυσικά χρειαστούμε να προβούμε σε αυτές.
Προσωπικά χρόνια τώρα έχω επιλέξει να έχω περισσότερα από ένα data files σε κάθε database που δημιουργώ καθώς έχω την δυνατότητα να εκμεταλλευτώ όλα τα παραπάνω ανά πάσα στιγμή.
Αυτό που συνηθίζω είναι να αφήνω μόνο του το primary data file στο primary filegroup στο οποίο ουσιαστικά μένουν τα system objects και όλα τα άλλα objects ανάλογα με την περίπτωση μπαίνουν σε ένα ή περισσότερα filegroups. Για παράδειγμα όλα τα transactional tables μαζί με τους indexes τους τα βάζω σε ξεχωριστά filegroups και σε ένα όλους τους άλλους πίνακες. Αυτό το κάνω πάντα σε databases που έχουν την δυναμική να γίνουν large ή very large databases.
Σας προτρέπω να δοκιμάστε κάτι αντίστοιχο και θα δείτε με διαφορετική εικόνα το τι κάνετε μέχρι τώρα!
/*antonch*/