Ich versuche, einige Tabellen mit NVARCHAR(MAX)
Feldern zu komprimieren . Leider haben die row
und die page
Komprimierung nicht die gewünschte Auswirkung (nur ~ 100/200 MB für 20-GB-Tabelle gespeichert). Außerdem kann ich keine Archivkomprimierungen für Spaltenspeicher und Spaltenspeicher anwenden, da sie die Komprimierung von NVARCHAR(MAX)
Feldern nicht unterstützen .
Kann jemand sagen, ob ich hier Alternativen habe?
Ich denke auch, dass die Komprimierung row
und page
keine Auswirkungen haben, da der Inhalt der NVARCHAR(MAX)
Spalten eindeutig ist.
VARCHAR
Datenverlusten führen, wenn Zeichen aus mehr als einer Codepage verwendet werden? Ich würde denken, der Rat sollte sein, umzuwandeln,NVARCHAR(4000)
wenn die maximale Länge nicht größer als 4000 ist, weil dann alle Werte für die volle Unicode-Komprimierung geeignet wären. Dennoch ist es wahrscheinlich sicher anzunehmen, dass die Werte weit über 4000 Zeichen liegen, weshalb sie derzeit nicht komprimiert werden.Antworten:
Sowohl die Seiten- als auch die Zeilenkomprimierung komprimieren keine BLOBs .
Wenn Sie BLOBs komprimieren möchten, müssen Sie diese als speichern
VARBINARY(MAX)
und den gewünschten Stream-Komprimierungsalgorithmus anwenden. Zum BeispielGZipStream
. Es gibt viele Beispiele dafür, suchen Sie einfach nach GZipStream und SQLCLR.quelle
Es gibt (jetzt) möglicherweise zwei Möglichkeiten, eine benutzerdefinierte Komprimierung durchzuführen:
Ab SQL Server 2016 gibt es integrierte Funktionen für COMPRESS und DECOMPRESS . Diese Funktionen verwenden den GZip-Algorithmus.
Verwenden Sie SQLCLR, um einen beliebigen Algorithmus zu implementieren (wie @Remus in seiner Antwort erwähnt). Diese Option ist in Versionen vor SQL Server 2016 verfügbar und reicht bis zu SQL Server 2005 zurück.
GZip ist eine einfache Wahl, da es in .NET und in den unterstützten .NET Framework-Bibliotheken verfügbar ist (der Code kann sich in einer
SAFE
Assembly befinden). Wenn Sie GZip verwenden möchten, sich aber nicht mit dem Codieren / Bereitstellen befassen möchten, können Sie die Funktionen Util_GZip und Util_GUnzip verwenden, die in der kostenlosen Version der SQL # SQLCLR-Bibliothek (deren Autor ich bin) verfügbar sind .Wenn Sie sich für die Verwendung von GZip entscheiden, unabhängig davon, ob Sie es selbst codieren oder SQL # verwenden, beachten Sie, dass sich der in .NET für die GZip-Komprimierung verwendete Algorithmus in Framework Version 4.5 zum Besseren geändert hat (siehe Abschnitt "Hinweise" im MSDN) Seite für die GZipStream-Klasse ). Das heisst:
Sie müssen jedoch nicht GZip verwenden und können beliebige Algorithmen implementieren.
BITTE BEACHTEN SIE: Alle oben genannten Methoden sind eher "Workarounds" als tatsächliche Ersetzungen, obwohl sie technisch "alternative Wege zur Komprimierung von NVARCHAR (MAX) -Daten" darstellen. Der Unterschied besteht darin , dass mit der eingebauten in Data Compression -
row
undpage
- angeboten von SQL Server wird die Kompression hinter den Kulissen und die Daten sind noch brauchbar, lesbar und Wende behandelt. Das Komprimieren beliebiger DatenVARBINARY
bedeutet jedoch, dass Sie Platz sparen, jedoch einige Funktionen aufgeben. Zwar ist eine 20k-Zeichenfolge ohnehin nicht indizierbar, sie kann jedoch weiterhin in a verwendet werdenWHERE
Klausel oder mit beliebigen String-Funktionen. Um irgendetwas mit einem benutzerdefinierten komprimierten Wert zu tun, müssten Sie ihn sofort dekomprimieren. Beim Komprimieren von Binärdateien (PDFs, JPEGs usw.) ist dies kein Problem, diese Frage war jedoch spezifisch fürNVARCHAR
Daten.quelle