NVARCHAR(MAX)を圧縮する別の方法は?


14

NVARCHAR(MAX)フィールドを持ついくつかのテーブルを圧縮しようとしています。あいにく、圧縮rowpage圧縮には希望の影響はありません(20 GBのテーブルに対して保存されるのは〜100/200 MBのみです)。また、列ストアおよび列ストアのアーカイブ圧縮は、NVARCHAR(MAX)フィールドの圧縮をサポートしていないため、適用できません。

ここに他の選択肢があるかどうかは誰にもわかりますか?

また、列の内容は一意であるため、rowand page圧縮は効果がないと思いNVARCHAR(MAX)ます。


2
列の値は8000文字よりも確実に広いですか?例:SELECT MAX(CAST(LEN(widecolumn)AS BIGINT))FROM dbo.largeTableそれ以外の場合は、通常のvarcharに変換してクラスター化された列ストアを適用できます。
wBob 14年

@wBob最大値が2000文字のみであったとしてもVARCHAR、複数のコードページの文字が使用されている場合、潜在的にデータ損失を引き起こすように変換しないでしょうか?NVARCHAR(4000)最大長が4000以下の場合、すべての値が完全なUnicode圧縮に適格になるため、変換することをお勧めします。それでも、質問の情報から、値が4000文字をはるかに超えていると想定するのがおそらく安全です。そのため、現在圧縮されていません。
ソロモンラッツキー16

回答:


16

ページと行の両方の圧縮では、BLOBは圧縮さません

サイズが大きいため、大きな値のデータ型は、特別な目的のページの通常の行データとは別に保存される場合があります。データ圧縮は、個別に保存されているデータには使用できません。

BLOBを圧縮する場合は、BLOBとして保存しVARBINARY(MAX)、選択したストリーム圧縮アルゴリズムを適用する必要があります。たとえばGZipStream。これを行うには多くの例があります。GZipStreamとSQLCLRを検索するだけです。


10

(現在)カスタム圧縮を実現するには、2つの方法があります。

  1. SQL Server 2016以降、COMPRESSおよびDECOMPRESSの組み込み関数があります。これらの関数はGZipアルゴリズムを使用します。

  2. SQLCLRを使用して、選択した任意のアルゴリズムを実装します(@Remusが回答で述べたように)。このオプションは、SQL Server 2016より前のバージョンで使用でき、SQL Server 2005までさかのぼります。

    GZipは、.NET およびサポートされている.NET Frameworkライブラリで使用できるため、簡単に選択できます(コードはSAFEアセンブリに含めることができます)。または、GZipが必要であるがコーディング/デプロイを処理したくない場合は、SQL# SQLCLRライブラリの無料版(私は著者です)で利用可能なUtil_GZipおよびUtil_GUnzip関数を使用できます。

    自分でコーディングするかSQL#を使用するかにかかわらず、GZipを使用することにした場合は、.NETでGZip圧縮を行うアルゴリズムがFrameworkバージョン4.5で変更されていることに注意してください(MSDNの「備考」セクションを参照してください)GZipStream Classのページ)。これの意味は:

    1. SQL Server 2005、2008、または2008 R2(すべてフレームワークバージョン2.0、3.0、および3.5を処理するCLR v 2.0にリンク)を使用している場合、フレームワークバージョン4.5で行われた変更は効果がなく、残念ながらそのままです.NETのオリジナルのサッキーアルゴリズム。
    2. SQL Server 2012以降(これまでの2014年と2016年)を使用している場合(すべてフレームワークバージョン4.0、4.5.x、4.6を処理するCLR v 4.0にリンクされている場合)、より新しい、より良いアルゴリズムを使用できます。唯一の要件は、SQL Serverを実行しているサーバーの.NET Frameworkをバージョン4.5以降に更新したことです。

    ただし、GZipを使用する必要はなく、任意のアルゴリズムを自由に実装できます。

注意:上記のすべての方法は、技術的には「NVARCHAR(MAX)を圧縮する代替方法」のデータであるにもかかわらず、実際の置き換えではなく「回避策」です。違いは、データ圧縮を内蔵して- rowpage- SQL Serverによって提供され、圧縮が舞台裏処理され、データがまだ、使用可能な読みやすい、そして割り出し可能です。ただし、データをに圧縮するVARBINARYと、スペースは節約できますが、一部の機能は放棄されます。確かに、20k文字列はとにかくインデックス化できませんが、それでも使用できますWHERE句、または任意の文字列関数を使用します。カスタム圧縮値を使用して何かを行うには、その場で解凍する必要があります。バイナリファイル(PDF、JPEGなど)を圧縮する場合、これは問題ではありませんが、この質問はNVARCHARデータに固有のものでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.