SQL Serverには、 sp_estimate_data_compression_savings
と呼ばれるシステムストアドプロシージャがあります。 、これにより、さまざまなレベルの圧縮でオブジェクトのサイズとその推定サイズを確認できます。
オブジェクトがすでに圧縮されている場合は、この手順を使用して、再圧縮されたときのサイズを見積もることができます。
オブジェクトは、行、ページ、列ストア、または列ストアのアーカイブ圧縮を使用して圧縮できます。
圧縮は、テーブル全体またはテーブルの一部に対して評価できます。これには、ヒープ、クラスター化インデックス、非クラスター化インデックス、列ストアインデックス、インデックス付きビュー、テーブルとインデックスのパーティションが含まれます。
例
実例を示します。
EXEC sp_estimate_data_compression_savings
@schema_name = 'Warehouse',
@object_name = 'StockItemHoldings',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'ROW';
結果:
+-------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+ | object_name | schema_name | index_id | partition_number | size_with_current_compression_setting(KB) | size_with_requested_compression_setting(KB) | sample_size_with_current_compression_setting(KB) | sample_size_with_requested_compression_setting(KB) | |-------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------| | StockItemHoldings | Warehouse | 1 | 1 | 32 | 8 | 40 | 16 | +-------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+
横スクロールをしすぎるのを防ぐために、ここでも垂直出力を使用しています:
-[ RECORD 1 ]------------------------- object_name | StockItemHoldings schema_name | Warehouse index_id | 1 partition_number | 1 size_with_current_compression_setting(KB) | 32 size_with_requested_compression_setting(KB) | 8 sample_size_with_current_compression_setting(KB) | 40 sample_size_with_requested_compression_setting(KB) | 16
圧縮サイズの単位はキロバイト(KB)です。
この場合、このテーブルで行圧縮を使用することには大きな利点があるようです。 32KBから8KBになります。これは、正確な見積もりであることを前提としています。
前のコードを実行したときに、すべての引数名を指定しました。これらの名前を省略して、値を指定することもできます。
このように:
EXEC sp_estimate_data_compression_savings
'Warehouse',
'StockItemHoldings',
NULL,
NULL,
'ROW';
いずれにせよ、結果は同じです。
これもまたですが、今回は PAGE
を指定します ROW
の代わりに 圧縮タイプとして。
EXEC sp_estimate_data_compression_savings
@schema_name = 'Warehouse',
@object_name = 'StockItemHoldings',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'PAGE';
結果(垂直出力を使用):
-[ RECORD 1 ]------------------------- object_name | StockItemHoldings schema_name | Warehouse index_id | 1 partition_number | 1 size_with_current_compression_setting(KB) | 32 size_with_requested_compression_setting(KB) | 8 sample_size_with_current_compression_setting(KB) | 40 sample_size_with_requested_compression_setting(KB) | 16
この場合、数値は同じように見えますが、データによっては大幅に異なる数値が得られる可能性があります。
圧縮タイプ
@data_compression
引数は次の値を受け入れます:
なし
-
ROW
-
PAGE
-
COLUMNSTORE
-
COLUMNSTORE_ARCHIVE
これらは、テーブルまたはインデックスを作成/変更するときに使用できる圧縮オプションです。
COLUMNSTORE
およびCOLUMNSTORE_ARCHIVE
オプションは、列ストアインデックス(非クラスター化列ストアインデックスとクラスター化列ストアインデックスの両方を含む)でのみ使用できます。
@index_id
引数
結果は、特定のオブジェクトに対して複数の行を返し、それぞれが異なる index_idを持つ場合があります。 。
必要に応じて、特定のインデックスに絞り込むことができます。これを行うには、 index_idを指定します @index_id
へ 引数。
たとえば、次のコードを実行すると、それぞれが異なる index_idを持つ8つの行が返されます。 値。
EXEC sp_estimate_data_compression_savings
@schema_name = 'Warehouse',
@object_name = 'StockItemTransactions',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'ROW';
結果:
+-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+ | object_name | schema_name | index_id | partition_number | size_with_current_compression_setting(KB) | size_with_requested_compression_setting(KB) | sample_size_with_current_compression_setting(KB) | sample_size_with_requested_compression_setting(KB) | |-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------| | StockItemTransactions | Warehouse | 2 | 1 | 5568 | 4120 | 4280 | 3168 | | StockItemTransactions | Warehouse | 3 | 1 | 5184 | 3720 | 4264 | 3064 | | StockItemTransactions | Warehouse | 4 | 1 | 5568 | 4224 | 4288 | 3256 | | StockItemTransactions | Warehouse | 5 | 1 | 5528 | 4416 | 4280 | 3424 | | StockItemTransactions | Warehouse | 6 | 1 | 5192 | 3456 | 4264 | 2840 | | StockItemTransactions | Warehouse | 7 | 1 | 5192 | 3464 | 4264 | 2848 | | StockItemTransactions | Warehouse | 9 | 1 | 5416 | 4456 | 4264 | 3512 | | StockItemTransactions | Warehouse | 1 | 1 | 2720 | 9096 | 2720 | 9096 | +-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+
1行だけに絞り込みたい場合は、その index_idを使用できます。 。
このように:
EXEC sp_estimate_data_compression_savings
@schema_name = 'Warehouse',
@object_name = 'StockItemTransactions',
@index_id =1,
@partition_number = NULL,
@data_compression = 'ROW';
結果:
+-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+ | object_name | schema_name | index_id | partition_number | size_with_current_compression_setting(KB) | size_with_requested_compression_setting(KB) | sample_size_with_current_compression_setting(KB) | sample_size_with_requested_compression_setting(KB) | |-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------| | StockItemTransactions | Warehouse | 1 | 1 | 2720 | 9096 | 2720 | 9096 | +-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+
@partition_numberを使用することもできます パーティションでも同じことをします。
圧縮の量は大幅に変動する可能性があります
取得する圧縮の量は、データと圧縮の種類によって異なります。
ROW
たとえば、圧縮では、列の値を可変長形式で格納することにより、不要なバイトを列の値から削除します。 PAGE
一方、圧縮では、繰り返し値がページごとに1回だけ格納され、ページ内のそれぞれの列からポインタが設定されます。
オブジェクトを圧縮しても必ずしもサイズが小さくなるとは限らない場合があります。場合によっては、実際に大きくなる場合もあります。 そのサイズ。
これは、列が圧縮の恩恵を受けないデータ型を使用している場合に発生する可能性があります。
また、行の圧縮によりメタデータのオーバーヘッドが削減されますが、場合によっては、オーバーヘッドが古いストレージ形式よりも大きくなることがあります。
データタイプが原因でデータが圧縮の恩恵を受けない場合は、オーバーヘッドによってストレージ要件が減少するのではなく、増加する可能性があります。
ただし、圧縮サイズの変動は実際のデータにも依存します。たとえば、 char(10)がある場合 列の場合、圧縮すると末尾のパディング文字がすべて削除されます。末尾にパディング文字が含まれる行がたくさんある場合は、末尾にパディング文字が含まれる行がない(または少ない)場合よりも良い結果が得られるはずです。
圧縮をどのように推定しますか?
sp_estimate_data_compression_savings
を実行する場合 、データのサンプルを取得し、それを tempdbで作成された同等のテーブルとインデックスにロードします 。 tempdbで作成されるテーブルまたはインデックス 次に、要求された設定に圧縮され、推定圧縮節約量が計算されます。
それはどれくらい正確ですか?
sp_estimate_data_compression_savings
を使用すると、結果がまちまちになる場合があります 。
少しテストを実行してみましょう。
SELECT * INTO Warehouse.StockItemTransactions2
FROM Warehouse.StockItemTransactions;
EXEC sp_spaceused 'Warehouse.StockItemTransactions2';
結果(垂直出力を使用):
name | StockItemTransactions2 rows | 236667 reserved | 15944 KB data | 15800 KB index_size | 8 KB unused | 136 KB
sp_spaceused
ストアドプロシージャは、実際に使用されているディスク容量を示しています。この場合、データは15,800KBのディスクスペースを使用します。
次に、 sp_estimate_data_compression_savings
を実行します そのテーブルに圧縮を適用した場合にどのようなスペース節約が得られるかを確認します。
EXEC sp_estimate_data_compression_savings
@schema_name = 'Warehouse',
@object_name = 'StockItemTransactions2',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'ROW';
結果(垂直出力を使用):
object_name | StockItemTransactions2 schema_name | Warehouse index_id | 0 partition_number | 1 size_with_current_compression_setting(KB) | 15808 size_with_requested_compression_setting(KB) | 9096 sample_size_with_current_compression_setting(KB) | 15800 sample_size_with_requested_compression_setting(KB) | 9096
これらの結果によると、このテーブルに行圧縮を適用すると、そのサイズは15,808KBから推定サイズの9,096KBに減少します。悪くない。
次に、このテーブルに行圧縮を適用してから、 sp_spaceused
を実行します。 もう一度。
ALTER TABLE Warehouse.StockItemTransactions2
REBUILD WITH (DATA_COMPRESSION = ROW);
EXEC sp_spaceused 'Warehouse.StockItemTransactions2';
結果(垂直出力を使用):
name | StockItemTransactions2 rows | 236667 reserved | 9160 KB data | 9088 KB index_size | 8 KB
したがって、実際の結果は推定結果に非常に近くなります。
この場合、 sp_estimate_data_compression_savings
最終結果のかなり正確な見積もりを提供しました。
sp_estimate_data_compression_savings
を実行してみましょう もう一度ですが、 NONE
の圧縮タイプを使用します 。
EXEC sp_estimate_data_compression_savings
@schema_name = 'Warehouse',
@object_name = 'StockItemTransactions2',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'NONE';
結果:
object_name | StockItemTransactions2 schema_name | Warehouse index_id | 0 partition_number | 1 size_with_current_compression_setting(KB) | 9096 size_with_requested_compression_setting(KB) | 15808 sample_size_with_current_compression_setting(KB) | 9096 sample_size_with_requested_compression_setting(KB) | 15808
これは、圧縮なしに戻した場合に何が起こるかを示しています。
この場合、圧縮を適用する前に表示されたのとまったく同じ数値(15,808 KB)が表示されます。これは、覚えていると思いますが、 sp_spaceused によって返される実際のサイズ(15,800 KB)にかなり近いものでした。コード> 手順。
それでは、もう一度実行して調べてみましょう。
ALTER TABLE Warehouse.StockItemTransactions2
REBUILD WITH (DATA_COMPRESSION = NONE);
EXEC sp_spaceused 'Warehouse.StockItemTransactions2';
結果(垂直出力を使用):
name | StockItemTransactions2 rows | 236667 reserved | 15880 KB data | 15800 KB index_size | 8 KB unused | 72 KB
繰り返しになりますが、 sp_estimate_data_compression_savings
ほぼスポットでした。
ただし、これは1つの簡単なテストにすぎません。他のテストでは、かなり離れた推定値が返される可能性があります。 sp_estimate_data_compression_savings
の記事を読みました 非常に不正確な結果を返しますが、私自身はまだそれを経験していません。
したがって、 sp_estimate_data_compression_savings
のように見えます 同じ場合に正確な見積もりを提供できますが、他の場合にはそれほど多くはありません。
このストアドプロシージャにどの程度の信頼を置くかを決定する必要があります。いずれの場合も、本番環境で圧縮を適用する前に、開発環境またはテスト環境でテストを実行する必要があります。