Από τον SQL Server 2008 υπάρχει ένα feature που είναι ιδανικό για BOL fields μέσα στην βάση. Αναφέρομαι φυσικά στο filestream.
Προσωπικά το έχω χρησιμοποιήσει σε μεγάλο βαθμό σε μια εφαρμογή στην οποία αποθηκεύονται έγγραφα, φωτογραφίες υψηλής ανάλυσης.
Θα ήθελα να προσθέσω μερικά ακόμα tips τα οποία προέρχονται 100% από την χρήση του σε μία βάση που το μέγεθος της είναι πολύυυυυυυυυυ μεγάλο. Φυσικά μπορείτε να βρείτε και άλλα στο web αλλά αυτά είναι που βγαίνουν από την δικιά μου εμπειρία.
- Ξεχωρίστε τα filestream data από τα table data. Είναι το πρώτο που θέλω να παραθέσω. Ποτέ μα ποτέ μην μπλέξετε τα δεδομένα του πίνακα σας με τα filestream data. Οι λόγοι που αναφέρω αυτό είναι οι εξής:
- Συντήρηση του πίνακα. Δυστυχώς το filestream δεν μπορείς να το ορίσεις μέσα από γραφικό περιβάλλον της δημιουργίας ενός πίνακα. Το ίδιο φυσικά ισχύει και για την τυχόν αλλαγή σε αυτόν. Επειδή πάντα δεν κάνεις εσύ την αλλαγή που θα χρειαστεί στον πίνακα αυτό αλλά και ακόμα και εσύ να την κάνεις πάντα μα σχεδόν πάντα θα ξεχάσεις ότι ο πίνακας έχει filestream θα πας με το SSMS και το γραφικό περιβάλλον να κάνεις την αλλαγή και την πάτησες. Χάνεται το filestream με συνέπεια να πρέπει να ξαναβάλεις πάλι τα δεδομένα.
- Για την περίπτωση που θέλεις να προσθέσεις κάποιο ακόμα πεδίο στον πίνακα σου και αυτός έχει filestream και έχει και πολλές μα πολλές εγγραφές η διαδικασία του alter table είναι απελπιστικά αργή.
- Επειδή την εφαρμογή την γράφετε εσείς και θα είστε προσεκτικοί (λέμε τώρα) αλλά τα δεδομένα μπορεί να τα διαβάζουν και άλλοι και είναι σχεδόν σίγουρο ότι κάνουν SELECT * είναι αμαρτία από τον θεό να διαβάζονται και blob data κατά λάθος. Είναι καλύτερα να διαβάζονται αυτά όταν πραγματικά χρειάζονται.
Για όλους τους παραπάνω λόγους συμβουλεύω όσους θέλουν να το χρησιμοποιήσουν να έχουν σε ξεχωριστό πίνακα τα blob fields. Για παράδειγμα έστω ότι έχω τον πίνακα των υπαλλήλων και θέλω να έχω την φωτογραφία του υπαλλήλου φτιάχνω ένα νέο πίνακα που θα είναι σε σχέση 1:1 ή 1:many ανάλογα με την ανάγκη μου και εκεί βάζω τα filestream data.- Επειδή όταν στο πίνακα που θα βάλω το filestream θα πρέπει να έχει ένα non-null row ID, αν προτίθεστε να βάλετε GUID χρησιμοποιήστε στο default contstraint την NEWSEQUENTIALID() αντί για την NEWID().
- Πάντα μα πάντα να βάζετε το filestream container σε ξεχωριστό φυσικό δίσκο από τα κανονικά δεδομένα και φροντίστε αυτός να είναι γρήγορος σε απόδοση. Ένας ακόμα λόγος για αυτό είναι ότι καλό είναι αυτός να είναι formatted με 64ΚΒ allocation αντί του default που έχει το NTFS και είναι 4KB.
- Τακτικά να κάνετε defragmentation στο δίσκο που έχετε το filestream container.
- ΠΟΤΕ μα ΠΟΤΕ μην κάνετε compress το δίσκο που έχει το filestream container.
- Ούτε encryption να μην κάνετε το δίσκο αυτό.
- Απενεργοποιήστε το search indexing στο δίσκο που έχετε το filestream container.
- Απενεργοποιήστε στο δίσκο που έχετε το filestream container τα 8.3 names. Αυτό μπορείτε να το κάνετε με ένα elevated commad prompt στο οποίο θα πρέπει να εκτελεστεί η FSUTIL BEHAVIOR SET DISABLE8DOT3 1
- Απενεργοποιήστε το last file access time tracking. Αυτό γίνεται πάλι με ένα elevated command prompt στο οποίο θα πρέπει να εκτελέσετε την FSUTIL BEHAVIOR SET DISABLELASTACCESS 1.
- Δεν βάζουμε ποτέ το antivirus να κάνει scan το δίσκο που έχει το filestream container. Αυτό βέβαια είναι κλασσικό tip και για τα αρχεία των βάσεων.
- Αποφεύγουμε όσο το δυνατόν περισσότερο να κάνουμε με T-SQL insert ή update data στο filestream. Χρησιμοποιούμε την .ΝΕΤ Class. Το πρόβλημα σε αυτό είναι ότι κάνει load αυτά στην TEMPDB η οποία είναι σκόπιμο να έχει πολλαπλά αρχεία.
- Ελέγχουμε με την FMTMC.exe filters σε ένα elevated command prompt αν έχει γίνει load o SQL Server FILESTEAM driver rsfx (π.χ rsfx0100.sys) και αν είναι στο τέλος του stack. Ζητήστε την βοήθεια του storage manufacturer για αυτό ή κάποιου που είναι storage expert έχει πολύ μεγάλη σημασία.
/*antonch*/