sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのデータ圧縮の節約を見積もる

    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 手順。

    それでは、もう一度実行して調べてみましょう。

    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 のように見えます 同じ場合に正確な見積もりを提供できますが、他の場合にはそれほど多くはありません。

    このストアドプロシージャにどの程度の信頼を置くかを決定する必要があります。いずれの場合も、本番環境で圧縮を適用する前に、開発環境またはテスト環境でテストを実行する必要があります。


    1. SQLを使用して日付フィールドから月でグループ化する方法

    2. 重複キーで無視しますか?

    3. 参照カーソルを返すOracleプロシージャから、どのようにして適切にフォーマットされた結果を取得しますか?

    4. xamppを使用してSQLサーバーをPHPに接続する方法は?