web-dev-qa-db-ja.com

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

NVARCHAR(MAX)フィールドを持ついくつかのテーブルを圧縮しようとしています。残念ながら、row圧縮とpage圧縮は、望ましい影響を与えません(20 GBのテーブルで約100/200 MBしか節約されません)。また、列ストアおよび列ストアアーカイブの圧縮は、NVARCHAR(MAX)フィールドの圧縮をサポートしていないため、適用できません。

ここに代替案があるかどうか誰かが教えてもらえますか?

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

15
gotqn

ページと行の両方の圧縮 BLOBを圧縮しない

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

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

16
Remus Rusanu

(今のところ)カスタム圧縮を実行するには、2つの方法が考えられます。

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

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

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

    自分でコーディングするか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) "データを圧縮します。違いは、SQL Serverが提供する組み込みのデータ圧縮(rowpage)を使用すると、圧縮は舞台裏で処理され、データは引き続き使用可能で読み取り可能であることです。 、および索引付け可能です。ただし、データをVARBINARYに圧縮すると、スペースを節約できますが、一部の機能は放棄されます。確かに、20kの文字列はインデックス付けできませんが、WHERE句で、または任意の文字列関数で使用できます。カスタム圧縮値を使用して何かを行うには、その場で解凍する必要があります。バイナリファイル(PDF、JPEGなど)を圧縮する場合、これは問題にはなりませんが、この質問はNVARCHARデータに固有のものでした。

10
Solomon Rutzky