2012-11-16 14 views
64

To jest stare pytanie, które znam, ale z SQL Server 2012 jest w końcu dobrze przechowywać pliki w bazie danych, czy też powinny one być rzeczywiście przechowywane w systemie plików tylko z odniesieniami do nich w bazie danych?Przechowywanie plików w SQL Server

Jeśli przechowywanie ich w bazie danych jest obecnie uważane za akceptowalne, jaki jest najskuteczniejszy sposób na zrobienie tego? Planuję zastosować szyfrowanie, więc doceniam, że przetwarzanie nie będzie błyskawiczne.

Dzięki

+6

Nie jestem pewien, czy mam. Chcę tylko wiedzieć, czy teraz jest to realna opcja. – CompanyDroneFromSector7G

Odpowiedz

88

Istnieje bardzo dobra publikacja firmy Microsoft Research pod nazwą To Blob or Not To Blob.

Ich wniosek po dużej liczbie testów wydajnościowych oraz analiza jest taka:

  • jeśli zdjęcia lub dokumentu są zwykle poniżej 256K wielkości, przechowywanie ich w bazie danych kolumna VARBINARY jest bardziej wydajny

  • jeśli twoje zdjęcia lub dokument mają zwykle rozmiar powyżej 1 MB, przechowywanie ich w systemie plików jest bardziej wydajne (i z atrybutem FILESTREAM programu SQL Server 2008, nadal są one pod kontrolą transakcji i częścią bazy danych)

  • pomiędzy tymi dwoma, to trochę wrzucić-up w zależności od zastosowania

Jeśli zdecydujesz się umieścić swoje zdjęcia do tabeli SQL Server, gorąco polecam korzystania osobną tabelę do przechowywania tych zdjęcia - nie przechowuj zdjęcia pracownika w tabeli pracownika - trzymaj je w osobnym stoliku. W ten sposób tabela Pracownicy może pozostać szczupła, średnia i bardzo wydajna, zakładając, że nie zawsze trzeba również wybierać zdjęcie pracownika, jako część swoich zapytań.

Dla grup plików, sprawdź Files and Filegroup Architecture dla intro. Zasadniczo można utworzyć bazę danych z oddzielną grupa plików dla dużych struktur danych od samego początku lub dodać dodatkową grupę plików później. Nazwijmy to "LARGE_DATA".

Teraz, gdy masz nową tabelę do tworzenia, który musi przechowywać VARCHAR (MAX) lub varbinary (max) kolumny, można określić tę grupę plików dla dużych danych:

CREATE TABLE dbo.YourTable 
    (....... define the fields here ......) 
    ON Data     -- the basic "Data" filegroup for the regular data 
    TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

Sprawdź MSDN intro na filegroups i baw się z nim!

+1

Dobrze powiedziane. Wszystko zależy oczywiście od użycia, ale strumień plików jest często dobrym rozwiązaniem. – TimothyAWiseman

+2

Cytowany artykuł badawczy pochodzi z kwietnia 2006. Z pewnością wiele rzeczy zmieniło się od tego czasu. – Oxon

+2

@ 1576573987: Nie, nie do końca - te wnioski są nadal ważne, o ile mogę stwierdzić, –

10

Możecie przeczytać na FILESTREAM. Oto kilka informacji z docs, które powinny pomóc Ci zdecydować:

Jeśli następujące warunki są spełnione, należy rozważyć użycie FILESTREAM:

  • obiektów, które są przechowywane są przeciętnie większe niż 1 MB.
  • Szybki dostęp do odczytu jest ważny.
  • Tworzysz aplikacje, które używają warstwy środkowej dla logiki aplikacji.

W przypadku mniejszych obiektów przechowywanie varbinary (max) BLOB w bazie danych często zapewnia lepszą wydajność przesyłania strumieniowego.

+0

Właściwie mógłbym zrobić oba/albo, w zależności od rozmiaru pliku. Dzięki! – CompanyDroneFromSector7G

22

Jest nadal ma prostej odpowiedzi. To zależy od twojego scenariusza. MSDN has documentation to help you decide.

Dostępne są inne opcje. Zamiast przechowywać w systemie plików bezpośrednio lub w obiekcie BLOB, można użyć FileStream lub tabeli plików w SQL Server 2012. Zalety Tabeli plików wydają się być nieinteligentne (ale przyznaję, że nie mam osobistego doświadczenia z nimi .)

Artykuł jest zdecydowanie wart odczytu.

+0

+1, jeszcze lepszy link na rok 2012. –

+0

Dobre informacje dzięki! – CompanyDroneFromSector7G