Wie groß sind diese Bilder und wie viele erwarten Sie? Obwohl ich @sp_BlitzErik größtenteils zustimme , denke ich, dass es einige Szenarien gibt, in denen dies in Ordnung ist, und daher wäre es hilfreich, ein klareres Bild davon zu haben, was hier tatsächlich angefordert wird.
Einige Optionen, um zu berücksichtigen, dass die meisten negativen Aspekte, auf die Erik hingewiesen hat, gemildert werden, sind:
Beide Optionen dienen als Mittelweg zwischen dem vollständigen Speichern von BLOBs in SQL Server oder dem vollständigen Speichern außerhalb von BLOBs (mit Ausnahme einer Zeichenfolge, die den Pfad beibehält). Sie ermöglichen es BLOBs, Teil des Datenmodells zu sein und an Transaktionen teilzunehmen, ohne Platz im Pufferpool (dh Speicher) zu verschwenden. Die BLOB-Daten sind weiterhin in den Sicherungen enthalten, wodurch sie mehr Speicherplatz beanspruchen und länger für die Sicherung und die Sicherung benötigenetwas wiederherstellen. Es fällt mir jedoch schwer, dies als echtes Negativ zu sehen, da es, wenn es Teil der App ist, irgendwie gesichert werden muss und nur eine Zeichenfolgenspalte mit dem Pfad vollständig getrennt ist und BLOBs-Dateien abrufen können gelöscht, ohne dass dies in der Datenbank angegeben ist (dh ungültige Zeiger / fehlende Dateien). Es ermöglicht auch, dass Dateien in der Datenbank "gelöscht" werden, aber immer noch im Dateisystem vorhanden sind, das eventuell bereinigt werden muss (z. B. Kopfschmerzen). Wenn die Dateien jedoch RIESIG sind, ist es möglicherweise am besten, sie mit Ausnahme der Pfadspalte vollständig außerhalb von SQL Server zu belassen.
Dies hilft bei der Frage nach innen oder außen, berührt jedoch nicht die Frage nach einer einzelnen Tabelle gegenüber der Frage nach mehreren Tabellen. Ich kann sagen, dass es über diese spezifische Frage hinaus durchaus gültige Fälle gibt, in denen Tabellen auf der Grundlage von Verwendungsmustern in Spaltengruppen aufgeteilt werden. Bei 50 oder mehr Spalten wird häufig auf einige zugegriffen, bei anderen nicht. Einige Spalten werden häufig beschrieben, während andere meistens gelesen werden. Das Aufteilen von Spalten, auf die häufig zugegriffen wird, und Spalten, auf die selten zugegriffen wird, in mehrere Tabellen mit einer 1: 1-Beziehung ist häufig von Vorteil, da der Speicherplatz im Pufferpool für Daten, die Sie wahrscheinlich nicht verwenden, verschwendet wird (ähnlich wie beim regulären Speichern großer Bilder)VARBINARY(MAX)
Spalten ist ein Problem)? Sie erhöhen auch die Leistung der Spalten, auf die häufig zugegriffen wird, indem Sie die Zeilengröße verringern und somit mehr Zeilen auf eine Datenseite passen, wodurch die Lesevorgänge (sowohl physisch als auch logisch) effizienter werden. Natürlich führen Sie auch eine gewisse Ineffizienz ein, indem Sie die PK duplizieren müssen, und jetzt müssen Sie manchmal die beiden Tabellen verknüpfen, was auch einige Abfragen (wenn auch nur geringfügig) kompliziert.
Es gibt also verschiedene Ansätze, und was am besten ist, hängt von Ihrer Umgebung und dem ab, was Sie erreichen möchten.
Ich hatte den Eindruck, dass SQL Server nur einen Zeiger auf eine bestimmte BLOB-Datenstruktur in der Tabelle speichert
Nicht so einfach. Hier finden Sie einige gute Informationen: Wie groß ist der LOB-Zeiger für (MAX) -Typen wie Varchar, Varbinary usw.? , aber die Grundlagen sind:
TEXT
, NTEXT
Und IMAGE
Datentypen (Standard): 16 - Byte - Pointer
VARCHAR(MAX)
, NVARCHAR(MAX)
, VARBINARY(MAX)
(Standardeinstellung):
- Wenn die Daten in die Zeile passen, werden sie dort platziert
- Wenn die Daten weniger als ca. 40.000 Bytes (der verlinkte Blog-Beitrag zeigt 40.000 als Obergrenze, aber meine Tests ergaben einen etwas höheren Wert) UND wenn in der Zeile Platz für diese Struktur ist, gibt es zwischen 1 und 5 direkte Links zu LOB-Seiten, beginnend bei 24 Bytes für die erste Verbindung zu den ersten 8000 Bytes und 12 Bytes mehr für jede weitere Verbindung für jede weitere Gruppe von 8000 Bytes, bis zu 72 Bytes max.
- Wenn die Daten über ca. 40.000 Bytes ODER es ist nicht genug Platz für die Speicherung der entsprechenden Anzahl von Direktverbindungen (z. B. nur noch 40 Bytes in der Zeile und ein Wert von 20.000 Bytes benötigt 3 Verbindungen, dh 24 Bytes für die ersten plus 12 für die zwei zusätzlichen Verbindungen für 48 Bytes insgesamt benötigter Platz in der Zeile), dann gibt es nur einen 24-Byte-Zeiger auf eine Textbaumseite, die die Links zu den LOB-Seiten enthält.