NVARCHAR(MAX)
フィールドを持ついくつかのテーブルを圧縮しようとしています。残念ながら、row
圧縮とpage
圧縮は、望ましい影響を与えません(20 GBのテーブルで約100/200 MBしか節約されません)。また、列ストアおよび列ストアアーカイブの圧縮は、NVARCHAR(MAX)
フィールドの圧縮をサポートしていないため、適用できません。
ここに代替案があるかどうか誰かが教えてもらえますか?
NVARCHAR(MAX)
列の内容は一意であるため、row
およびpage
圧縮は効果がないと思います。
ページと行の両方の圧縮 BLOBを圧縮しない 。
サイズが大きいため、大きな値のデータ型は、特別な目的のページの通常の行データとは別に格納される場合があります。個別に保管されているデータには、データ圧縮は使用できません。
BLOBを圧縮する場合は、それらをVARBINARY(MAX)
として保存し、選択したストリーム圧縮アルゴリズムを適用する必要があります。たとえば GZipStream
です。これを行う方法の例はたくさんあります。GZipStreamとSQLCLRを検索してください。
(今のところ)カスタム圧縮を実行するには、2つの方法が考えられます。
SQL Server 2016以降、 [〜#〜] compress [〜#〜] および [〜#〜] decompress [〜#〜] の組み込み関数があります。これらの関数はGZipアルゴリズムを使用します。
SQLCLRを使用して、選択したアルゴリズムを実装します(@Remusが彼の回答で述べたように)。このオプションは、SQL Server 2016より前のバージョンで使用でき、SQL Server 2005まで遡ります。
GZipは、サポートされている.NET Frameworkライブラリ(コードはSAFE
アセンブリに含めることができます)の.NETおよび内で使用できるため、簡単に選択できます。または、GZipが必要で、コーディング/デプロイをしたくない場合は、Util_GZipとUtil_GUnzip関数は、無料版の SQL# SQLCLRライブラリ(私が作成者です)で使用できます。
自分でコーディングするかSQL#を使用するかにかかわらず、GZipを使用する場合は、.NETでGZip圧縮を実行するために使用されるアルゴリズムがFrameworkバージョン4.5で変更されたことに注意してください(MSDNの「解説」セクションを参照 GZipStream Class )のページ。これの意味は:
ただし、GZipを使用する必要はなく、任意のアルゴリズムを自由に実装できます。
注意:上記の方法はすべて、技術的には「代替手段」であるにもかかわらず、実際の置き換えではなく、「回避策」ですNVARCHAR(MAX) "データを圧縮します。違いは、SQL Serverが提供する組み込みのデータ圧縮(row
とpage
)を使用すると、圧縮は舞台裏で処理され、データは引き続き使用可能で読み取り可能であることです。 、および索引付け可能です。ただし、データをVARBINARY
に圧縮すると、スペースを節約できますが、一部の機能は放棄されます。確かに、20kの文字列はインデックス付けできませんが、WHERE
句で、または任意の文字列関数で使用できます。カスタム圧縮値を使用して何かを行うには、その場で解凍する必要があります。バイナリファイル(PDF、JPEGなど)を圧縮する場合、これは問題にはなりませんが、この質問はNVARCHAR
データに固有のものでした。