it-swarm.com.de

Alternative Möglichkeit, NVARCHAR (MAX) zu komprimieren?

Ich versuche einige Tabellen mit NVARCHAR(MAX) Feldern zu komprimieren. Leider haben die Komprimierung row und page nicht die gewünschte Auswirkung (nur ~ 100/200 MB für 20-GB-Tabelle gespeichert). Außerdem kann ich keine Spalten- und Spaltenspeicher-Archivkomprimierungen 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 Auswirkung haben, da der Inhalt der Spalten NVARCHAR(MAX) eindeutig ist.

15
gotqn

Sowohl Seiten- als auch Zeilenkomprimierung BLOBs nicht komprimieren .

Aufgrund ihrer Größe werden Datentypen mit großem Wert manchmal getrennt von den normalen Zeilendaten auf Spezialseiten gespeichert. Für die separat gespeicherten Daten ist keine Datenkomprimierung verfügbar.

Wenn Sie BLOBs komprimieren möchten, müssen Sie sie als VARBINARY(MAX) speichern und den Stream-Komprimierungsalgorithmus Ihrer Wahl anwenden. Zum Beispiel GZipStream . Es gibt viele Beispiele dafür. Suchen Sie einfach nach GZipStream und SQLCLR.

16
Remus Rusanu

Es gibt (jetzt) ​​möglicherweise zwei Möglichkeiten, um eine benutzerdefinierte Komprimierung durchzuführen:

  1. Ab SQL Server 2016 gibt es integrierte Funktionen für KOMPRIMIEREN und DEKOMPRIMIEREN . Diese Funktionen verwenden den GZip-Algorithmus.

  2. 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, die bis zu SQL Server 2005 zurückreichen.

    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 möchten, sich aber nicht mit dem Codieren/Bereitstellen befassen möchten, können Sie die Funktionen til_GZip und til_GUnzip verwenden, die in der kostenlosen Version von verfügbar sind SQL # SQLCLR-Bibliothek (deren Autor ich bin).

    Wenn Sie sich für die Verwendung von GZip entscheiden, unabhängig davon, ob Sie es selbst codieren oder SQL # verwenden, beachten Sie bitte, 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 GZipStream Class ). Das heisst:

    1. Wenn Sie SQL Server 2005, 2008 oder 2008 R2 verwenden - alle mit CLR v 2.0 verknüpft, das die Framework-Versionen 2.0, 3.0 und 3.5 unterstützt -, hat die in Framework Version 4.5 vorgenommene Änderung keine Auswirkungen und Sie bleiben leider hängen .NETs ursprünglicher, blöder Algorithmus.
    2. Wenn Sie SQL Server 2012 oder neuer (bisher 2014 und 2016) verwenden - alle mit CLR v 4.0 verknüpft, das die Framework-Versionen 4.0, 4.5.x, 4.6 verarbeitet -, können Sie den neueren, besseren Algorithmus verwenden. Die einzige Voraussetzung ist, dass Sie .NET Framework auf dem Server mit SQL Server auf Version 4.5 oder neuer aktualisiert haben.

    Sie müssen jedoch nicht GZip verwenden und können beliebige Algorithmen wie implementieren.

BITTE BEACHTEN SIE: Alle oben genannten Methoden sind eher "Workarounds" als tatsächliche Ersetzungen, obwohl sie technisch "alternative Möglichkeiten zum Komprimieren von NVARCHAR (MAX)" -Daten sind. Der Unterschied besteht darin, dass mit der von SQL Server angebotenen integrierten Datenkomprimierung row und page die Komprimierung hinter den Kulissen erfolgt und die Daten weiterhin verwendbar und lesbar sind und indexierbar. Das Komprimieren von Daten in ein VARBINARY bedeutet jedoch, dass Sie Platz sparen, aber einige Funktionen aufgeben. Eine 20k-Zeichenfolge ist zwar ohnehin nicht indizierbar, kann jedoch weiterhin in einer WHERE -Klausel oder mit beliebigen Zeichenfolgenfunktionen verwendet werden. Um etwas mit einem benutzerdefinierten komprimierten Wert zu tun, müssen Sie ihn im laufenden Betrieb dekomprimieren. Beim Komprimieren von Binärdateien (PDFs, JPEGs usw.) ist dies kein Problem, aber diese Frage war spezifisch für NVARCHAR -Daten.

10
Solomon Rutzky