Was genau bedeutet es, dass das Speichern von „großen Blobs in der Datenbank die Leistung verringert“?

8

Für jemanden, der Datenbank-Interna kennt, mag dies eine einfache Frage sein, aber kann jemand klar erklären, warum das Speichern großer Blobs (z. B. 400-MB-Filme) in der Datenbank die Leistung verringern soll und was genau das bedeutet? Dies ist eine Behauptung, die oft im Internet zu finden ist, aber ich habe nie gesehen, dass sie wirklich erklärt wurde.

Um genau zu sein, beziehe ich mich auf die SharePoint / MSSQL-Leistung, dh die Leistung beim Hochladen von Dateien, das Durchsuchen von Websites, das Anzeigen von Listen, das Öffnen von Dokumenten usw. - Vorgänge, die langsamer werden sollen, wenn eine Datenbank zu groß wird. Die Blob-Externalisierung in ein Dateisystem (das in SharePoint als Remote-Blob-Speicher bezeichnet wird, auch bekannt als Verschieben von Dateien aus der Datenbank, wobei nur eine Referenz übrig bleibt) soll dies bis zu einem gewissen Grad lösen. Was genau - auf der untersten Ebene - ist der Unterschied? Es ist offensichtlich, dass Backups mit riesigen Dateien, die in der Datenbank gespeichert sind, länger dauern würden ... aber welche Vorgänge sind genau betroffen und was ist der zugrunde liegende Mechanismus (dh auf welche Weise werden Dateien im Dateisystem außerhalb der Datenbank gespeichert, auf die zugegriffen wird oder die anders gespeichert werden)?

Angenommen, eine einfache Tabelle mit Spalten ID(guid, PK), FileName(string), Data(varbinary(max))- würde eine große DataSpalte Vorgänge wie das Anzeigen einer Liste von Dateien auf einer Website (von denen ich annehme, dass sie intern ausgeführt werden SELECT FileName FROM table) oder das Einfügen einer neuen Zeile wirklich verlangsamen ? Es ist nicht so, dass die eigentlichen binären Inhaltsspalten indiziert sind.

Ich weiß, dass einige Fragen wie diese bereits gestellt wurden, aber ich habe keine angemessene Erklärung gefunden.

w128
quelle
Es hängt davon ab, ob. Wenn Sie diese Dateien senden / empfangen möchten, müssen Sie Ihre Nummern wirklich aufschreiben, Ihre Hardware überprüfen und herausfinden, ob sie mit Blob-Speicher funktioniert. zB N Dateien x M Gigabyte, die jeweils von X Benutzern pro Stunde heruntergeladen / hochgeladen werden. Planen Sie dann die Festplatten / das Netzwerk / die CPU / den Speicher für die Datenbank, um die Spitzenlast zu bewältigen. Bei kleinen Projekten spielt es normalerweise keine Rolle, auf großen Systemen verlangsamt sich der Durchsatz von Datenbanktransaktionen, da die [teuren] Datenbank-CPUs und SSDs einen Job ausführen, der von IIS / Streaming-Prozessen erledigt oder auf zusätzliche App-Server skaliert werden kann
jqa

Antworten:

9

Dies hängt wirklich vom DB-System ab, aber eine wichtige Sache, die Sie bei BLOBs berücksichtigen müssen, ist die Transaktionsverarbeitung. Durch die Externalisierung in das Dateisystem werden Änderungen an den Binärdaten aus den Transaktionen übernommen. Dies führt in der Regel zu schnelleren Schreibvorgängen , im Gegensatz zu der Situation, in der die Datenbank die ACID-Konformität mit vollständigen Rollback-Mechanismen usw. sicherstellt.

Hypothetisch gesehen können auch langsamere Lesevorgänge auftreten, wenn Sie Daten aus Ihrer Datenbank aus einer BLOB-Tabelle abrufen, ohne die BLOB-Daten tatsächlich auszuwählen, da die Datenbank die verbleibenden Zeilen möglicherweise lokaler auf der Festplatte speichert, was einen schnelleren Lesezugriff ermöglicht (aber ich denke, die meisten Moderne DB-Systeme sind clever genug, um die tatsächlichen Binärdaten in einem separaten Plattenbereich oder Tabellenbereich zu speichern. Ohne dies mit einem realen Szenario zu testen, sollten hier keine allgemeinen Annahmen getroffen werden.

Doc Brown
quelle
7

Es ist normalerweise ein Problem mit der Bandbreite. Wenn Sie Hunderte von Videos pro Stunde bereitstellen, binden Sie die Bandbreite in und aus der Datenbank und kopieren hauptsächlich Puffer. Dies ist auch ein Problem, wenn Sie naive Abfragen haben (möglicherweise automatisch von einem ORM-Tool generiert), bei denen einfach alle Spalten aus einer Tabelle ausgewählt werden. Sie unterliegen auch einer Dateifragmentierung wie ein Dateisystem (außer in diesem Fall der Datensatzfragmentierung), jedoch (normalerweise) ohne Tools zum Entfragmentieren. Wenn Sie auch das BLOB ändern (z. B. unterstützen Sie eine Art Videobearbeitung), kopiert die Datenbank das gesamte BLOB in das Rollback- oder Redo-Segment und schreibt das aktualisierte BLOB in die Datenbank. Jetzt kopieren Sie diese mehreren hundert Megabyte.

TMN
quelle
6

Möglicherweise möchten Sie einen Blick in SQL Server FileTables werfen . Die Idee ist, das Beste aus beiden Welten zu bieten: Zugriff und Leistung auf Dateisystemebene sowie Datenbankzugriff und integrierte Sicherheit und Dienste. Die Datenbank weist in einigen Fällen einen Leistungs-Overhead auf. Vergleichen Sie einfach eine fest codierte HTML-Datei auf einem Webserver mit einer, die den Inhalt aus einer Datenbank abrufen muss.

Stellen Sie sich vor, eine Anwendung, bei der das Speichern von Blobs in der Datenbank nicht gefunden wurde, war eine erhebliche Leistungsbeschränkung, aber dann wuchs die App bis zu dem Punkt, an dem sie sich befand. Mit FileTables wird die Codierung weniger geändert. Sie können die Transaktion auch auf Datenbankebene und Dateiebene ohne viel Codierung verwalten. Die Datei- und Metadaten sind mit SQL verfügbar.

Auf dem Windows Server wird ein Freigabe-Laufwerk erstellt, um auf die Dateien zuzugreifen, ohne die Datenbanktransaktion über Kopf zu verwenden.

Es ist ein häufiges Problem, dass Microsoft versucht hat, "out of the box" mit SQL Server 2012 zu behandeln. Keine schlechte Funktion, um ein Upgrade zu rechtfertigen.

JeffO
quelle
5

Um zu wissen, warum dies hässlich ist, müssen Sie wissen, wie eine Datenbank auf der Festplatte gespeichert wird (insbesondere Zeilen). Der physische Inhalt einer auf der Festplatte gespeicherten Zeile wird in ihre statischen und dynamischen Gegenstücke unterteilt. Felder wie int, byte, char (n) mit fester Länge werden zuerst aufgelistet. Was folgt, ist eine Anzahl fester Länge, die sich auf die Anzahl der Felder variabler Länge bezieht, die folgen sollen. Alle variablen Felder (unabhängig von der Reihenfolge der Spalten, die Ihnen, dem Programmierer, angezeigt werden) werden am Ende hinzugefügt. Jedes Feld enthält eine feste Länge, die bestimmt, wie viel Platz das Feld mit variabler Länge einnimmt.

Um Ihnen ein konkretes Beispiel zu geben. Angenommen, meine Tabelle lautet wie folgt:

char(3) A
varchar(4) B
int C

Angenommen, ich tue es INSERT INTO mytable (A, B, C) VALUES ('AAA', 'B', 256). In der Datenbank würde diese Zeile wahrscheinlich wie folgt gespeichert: Darstellung der in der Datenbank gespeicherten Zeile

Feld A wird wie erwartet gespeichert. Hätte ich 'A' eingefügt, hätte es ein Sonderzeichen gegeben, um das vorzeitige Ende der Zeichenfolge nach dem ersten Zeichen zu markieren, aber es würde den gleichen Platz einnehmen.

Feld C wird als binäres Äquivalent von 256 gespeichert. Warum C und nicht B? C ist das nächste statische Feld mit fester Länge und wird daher zusammen mit allen anderen statischen Daten in der Datenbankzeile gruppiert.

Feld D ist eine Metainformation für die Datenbank, die angibt, dass im folgenden Abschnitt mit Feldern variabler Länge genau 1 Feld vorhanden ist.

Feld E ist wieder eine Metainformation für die Datenbank, die angibt, dass es für dieses bestimmte Feld höchstens 1 Zeichen lang ist. Diese Informationen sind wichtig, da die Datenbank sonst nicht wissen würde, wo Feld B endet und ein anderes Feld mit variabler Länge beginnt.

All dies, um zu demonstrieren, wie Datenbanken das Speichern von Feldern mit variabler Länge handhaben. BLOB ist in diesem Sinne ein Feld variabler Länge. Die Datenbankstruktur ermöglicht es einer Zeile, sowohl kleine als auch große Werte im BLOB zu enthalten. Hier spielen jedoch andere Faktoren eine Rolle. Datenbanken verarbeiten normalerweise Informationsblöcke, da sich Datenträger nicht um den Inhalt kümmern, sondern darum, ob er in einen einzelnen Block passt.

Die Datenbank versucht, so viele Zeilen in einen einzelnen Block zu passen, ohne eine Zeile in zwei Teile trennen zu müssen, da der Effekt ansonsten der gleiche ist wie bei einer fragmentierten Datei auf Ihrer Festplatte. Sobald ein Block geladen ist und die Zeile diesen bestimmten Block überläuft, muss die Festplatte in einem anderen Block nach dem Rest suchen. Schlimmer noch, eine Datenbank kann auf keinen Fall erkennen, dass eine Zeile mehr als einen Block belegt, ohne ihren Inhalt vollständig zu lesen, da sie eine variable Länge hat. Sie können also nicht optimieren, indem Sie beide Blöcke gleichzeitig abrufen.

Wenn Sie nach dieser Logik ein BLOB mit statischer Länge erstellen könnten, hätten Sie dieses Optimierungsproblem nicht, da die Datenbank einfach garantieren könnte, dass die Blockgröße größer als die minimale Zeilengröße ist, wodurch sichergestellt wird, dass die meisten Zeilen dies nicht tun müssen auf mehrere Chunks aufgeteilt werden. Datenbanken tun dies natürlich nicht, da dies bedeuten würde, wertvollen Speicherplatz bereitzustellen, wenn Sie ihn wahrscheinlich nicht benötigen.

BLOBS sind in Ordnung, wenn Sie mit relativ kleinen Mengen arbeiten, aber für große Dateien wie Videos und dergleichen besteht eine häufige Problemumgehung darin, einfach den Dateipfad in der Datenbank zu speichern und die Software das Laden der Datei übernehmen zu lassen, was fast immer mehr ist effizient.

Hoffe das erklärt es. :) :)

Neil
quelle