Speichern von Dateien in SQL Server

80

Es ist eine alte Frage, die ich kenne, aber mit SQL Server 2012 ist es endlich in Ordnung, Dateien in der Datenbank zu speichern, oder sollten sie wirklich im Dateisystem mit nur Verweisen auf sie in der Datenbank gespeichert werden?

Wenn das Speichern in der Datenbank heutzutage als akzeptabel angesehen wird, wie geht das am effektivsten?

Ich habe vor, Verschlüsselung anzuwenden, daher schätze ich, dass die Verarbeitung nicht blitzschnell sein wird.

CompanyDroneFromSector7G
quelle
6
Ich bin mir nicht sicher, ob ich es tue. Ich möchte nur wissen, ob es jetzt eine praktikable Option ist.
CompanyDroneFromSector7G

Antworten:

116

Es gibt ein wirklich gutes Papier von Microsoft Research mit dem Titel To Blob oder Not To Blob .

Ihre Schlussfolgerung nach einer Vielzahl von Leistungstests und Analysen lautet:

  • Wenn Ihre Bilder oder Dokumente in der Regel weniger als 256 KB groß sind, ist das Speichern in einer Datenbank-Spalte VARBINARY effizienter

  • Wenn Ihre Bilder oder Dokumente in der Regel größer als 1 MB sind, ist das Speichern im Dateisystem effizienter (und mit dem FILESTREAM-Attribut von SQL Server 2008 stehen sie weiterhin unter Transaktionskontrolle und sind Teil der Datenbank).

  • Dazwischen ist es je nach Verwendung ein bisschen durcheinander

Wenn Sie Ihre Bilder in eine SQL Server-Tabelle einfügen möchten, würde ich dringend empfehlen, eine separate Tabelle zum Speichern dieser Bilder zu verwenden. Speichern Sie das Mitarbeiterfoto nicht in der Mitarbeitertabelle. Bewahren Sie sie in einer separaten Tabelle auf. Auf diese Weise kann die Mitarbeitertabelle schlank und gemein und sehr effizient bleiben, vorausgesetzt, Sie müssen nicht immer auch das Mitarbeiterfoto als Teil Ihrer Abfragen auswählen.

Informationen zu Dateigruppen finden Sie unter Dateien und Dateigruppenarchitektur . Grundsätzlich würden Sie Ihre Datenbank entweder von Anfang an mit einer separaten Dateigruppe für große Datenstrukturen erstellen oder später eine zusätzliche Dateigruppe hinzufügen. Nennen wir es "LARGE_DATA".

Wenn Sie jetzt eine neue Tabelle erstellen müssen, in der VARCHAR- (MAX) oder VARBINARY- (MAX) Spalten gespeichert werden müssen, können Sie diese Dateigruppe für die großen Datenmengen angeben:

 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

Schauen Sie sich das MSDN-Intro für Dateigruppen an und spielen Sie damit herum!

marc_s
quelle
1
Gut gesagt. Es hängt natürlich alles vom Anwendungsfall ab, aber Filestream ist häufig eine gute Option.
TimothyAWiseman
3
Der von Ihnen zitierte Forschungsartikel stammt aus dem April 2006. Seitdem hat sich sicherlich viel geändert.
Oxon
2
@ 1576573987: nein, nicht wirklich - diese Schlussfolgerungen sind immer noch gültig, soweit ich das
beurteilen
Im Hinblick auf die Speicherung VARBINARY(MAX)in einem separaten Dateigruppe, wenn Sie eine separate „Datei“ Tabelle haben, speichern Sie nur , dass ganze Tabelle in der separaten Dateigruppe oder speichern Sie die Datei „meta“ Daten in der Standard - Dateigruppe (n) und speichern nur die VARBINARY(MAX)in die neue Dateigruppe?
RemarkLima
@RemarkLima: Sprechen Sie über die FILETABLEFunktion in SQL Server 2012? Dort werden nur die Metadaten über die Datei in SQL Server gespeichert (wie bei FILESTREAM) - die eigentliche Datei (die Bytes, aus denen sie besteht) werden außerhalb der Datenbank auf einem Laufwerk gespeichert
marc_s
29

Es gibt immer noch keine einfache Antwort. Das hängt von Ihrem Szenario ab. MSDN verfügt über eine Dokumentation, die Ihnen bei der Entscheidung hilft.

Hier werden weitere Optionen behandelt. Anstatt direkt oder in einem BLOB im Dateisystem zu speichern, können Sie FileStream oder File Table in SQL Server 2012 verwenden. Die Vorteile von File Table scheinen ein Kinderspiel zu sein (aber ich habe zugegebenermaßen keine persönlichen Erfahrungen aus erster Hand mit ihnen .)

Der Artikel ist auf jeden Fall eine Lektüre wert.

David
quelle
11

Sie können auf FILESTREAM nachlesen . Hier sind einige Informationen aus den Dokumenten, die Ihnen bei der Entscheidung helfen sollen:

Wenn die folgenden Bedingungen erfüllt sind, sollten Sie FILESTREAM in Betracht ziehen:

  • Objekte, die gespeichert werden, sind im Durchschnitt größer als 1 MB.
  • Schneller Lesezugriff ist wichtig.
  • Sie entwickeln Anwendungen, die eine mittlere Ebene für die Anwendungslogik verwenden.

Bei kleineren Objekten bietet das Speichern von varbinären (max) BLOBs in der Datenbank häufig eine bessere Streaming-Leistung.

Tim Lehner
quelle
Eigentlich könnte ich beides / beides machen, abhängig von der Dateigröße. Vielen Dank!
CompanyDroneFromSector7G