sp_estimate_data_compression_savings (Transact-SQL)sp_estimate_data_compression_savings (Transact-SQL)

適用対象: ○SQL Server (2008 以降) XAzure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

要求されたオブジェクトの現在のサイズ、および要求された圧縮状態での推定オブジェクト サイズを返します。Returns the current size of the requested object and estimates the object size for the requested compression state. 圧縮は、テーブル全体またはテーブルの一部について評価できます。Compression can be evaluated for whole tables or parts of tables. これには、ヒープ、クラスター化インデックスが含まれますが、非クラスター化インデックス、列ストア インデックス、インデックス付きビュー、およびテーブルおよびインデックス パーティション。This includes heaps, clustered indexes, nonclustered indexes, columnstore indexes, indexed views, and table and index partitions. オブジェクトは、行、ページ、列ストアまたは列ストア アーカイブの圧縮を使用して圧縮できます。The objects can be compressed by using row, page, columnstore or columnstore archive compression. テーブル、インデックス、またはパーティションが既に圧縮されている場合は、このプロシージャを使用して、再圧縮された場合のテーブル、インデックス、またはパーティションのサイズを推定できます。If the table, index, or partition is already compressed, you can use this procedure to estimate the size of the table, index, or partition if it is recompressed.


圧縮とsp_estimate_data_compression_savingsのすべてのエディションでは使用できないMicrosoftMicrosoftSQL ServerSQL Serverします。Compression and sp_estimate_data_compression_savings are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. SQL ServerSQL Serverの各エディションでサポートされる機能の一覧については、「 SQL Server 2016 の各エディションがサポートする機能」を参照してください。For a list of features that are supported by the editions of SQL ServerSQL Server, see Features Supported by the Editions of SQL Server 2016.

要求された圧縮設定を使用した場合のオブジェクト サイズを推定するために、このストアド プロシージャでは、ソース オブジェクトがサンプリングされ、そのデータが tempdb に作成された同等のテーブルとインデックスに読み込まれます。To estimate the size of the object if it were to use the requested compression setting, this stored procedure samples the source object and loads this data into an equivalent table and index created in tempdb. さらに、tempdb に作成されたテーブルまたはインデックスが要求された設定に圧縮され、圧縮で削減される推定領域が計算されます。The table or index create in tempdb is then compressed to the requested setting and the estimated compression savings is computed.

テーブル、インデックス、またはパーティションの使用の圧縮状態を変更する、 ALTER TABLEまたはALTER INDEXステートメント。To change the compression state of a table, index, or partition, use the ALTER TABLE or ALTER INDEX statements. 圧縮の詳細については、データ圧縮を参照してください。For general information about compression, see Data Compression.


既存のデータが断片化されている場合は、インデックスを再構築することで、圧縮を使用しなくてもデータのサイズを削減できる可能性があります。If the existing data is fragmented, you might be able to reduce its size without using compression by rebuilding the index. インデックスについては、再構築中に FILL FACTOR が適用されます。For indexes, the fill factor will be applied during an index rebuild. これによってインデックスのサイズが増える可能性があります。This could increase the size of the index.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions


     [ @schema_name = ] 'schema_name'    
   , [ @object_name = ] 'object_name'   
   , [@index_id = ] index_id   
   , [@partition_number = ] partition_number   
   , [@data_compression = ] 'data_compression'   


[ @schema_name=] 'schema_name'[ @schema_name= ] 'schema_name'
テーブルまたはインデックス付きビューを含んでいるデータベース スキーマの名前です。Is the name of the database schema that contains the table or indexed view. schema_namesysnameします。schema_name is sysname. 場合schema_nameが null の場合、現在のユーザーの既定のスキーマを使用します。If schema_name is NULL, the default schema of the current user is used.

[ @object_name=] 'object_name'[ @object_name= ] 'object_name'
インデックスが有効になっているテーブルまたはインデックス付きビューの名前です。Is the name of the table or indexed view that the index is on. object_namesysname です。object_name is sysname.

[ @index_id=] 'index_id'[ @index_id= ] 'index_id'
インデックスの ID です。Is the ID of the index. index_idint、値は次のいずれかを指定できます。 インデックスや NULL の場合は 0 の ID 番号object_idヒープ。index_id is int, and can be one of the following values: the ID number of an index, NULL, or 0 if object_id is a heap. ベース テーブルまたはビューのすべてのインデックスについて情報を返すには、NULL を指定します。To return information for all indexes for a base table or view, specify NULL. NULL を指定する場合は NULL も指定する必要がありますpartition_numberします。If you specify NULL, you must also specify NULL for partition_number.

[ @partition_number=] 'partition_number'[ @partition_number= ] 'partition_number'
オブジェクトのパーティション番号です。Is the partition number in the object. partition_numberint値は次のいずれかを指定できます。 インデックスまたはヒープ、NULL、または 1 をパーティション分割されていないインデックスまたはヒープのパーティション番号。partition_number is int, and can be one of the following values: the partition number of an index or heap, NULL or 1 for a nonpartitioned index or heap.

パーティションを指定するには、指定の$partition関数。To specify the partition, you can also specify the $partition function. 所有するオブジェクトのすべてのパーティションについて情報を返すには、NULL を指定します。To return information for all partitions of the owning object, specify NULL.

[ @data_compression=] 'data_compression'[ @data_compression= ] 'data_compression'
評価される圧縮の種類です。Is the type of compression to be evaluated. data_compression値は次のいずれかを指定できます。[なし]、行、ページ、列ストア、または COLUMNSTORE_ARCHIVE です。data_compression can be one of the following values: NONE, ROW, PAGE, COLUMNSTORE, or COLUMNSTORE_ARCHIVE.

リターン コードの値Return Code Values

0 (成功) または 1 (失敗)0 (success) or 1 (failure)

結果セットResult Sets

テーブル、インデックス、またはパーティションの現在のサイズと推定サイズの情報を提供する以下の結果セットが返されます。The following result set is returned to provide current and estimated size for the table, index, or partition.

列名Column name データ型Data type 説明Description
object_nameobject_name sysnamesysname テーブルまたはインデックス付きビューの名前。Name of the table or the indexed view.
schema_nameschema_name sysnamesysname テーブルまたはインデックス付きビューのスキーマ。Schema of the table or indexed view.
index_idindex_id intint インデックスのインデックス ID。Index ID of an index:

0 = ヒープ0 = Heap

1 = クラスター化インデックス1 = Clustered index

> 1 = 非クラスター化インデックス> 1 = Nonclustered index
partition_numberpartition_number intint パーティション番号。Partition number. 非パーティション テーブルまたはインデックスの場合は 1 を返します。Returns 1 for a nonpartitioned table or index.
size_with_current_compression_setting (KB)size_with_current_compression_setting (KB) bigintbigint 要求されたテーブル、インデックス、またはパーティションの現在のサイズ。Size of the requested table, index, or partition as it currently exists.
size_with_requested_compression_setting (KB)size_with_requested_compression_setting (KB) bigintbigint 要求された圧縮設定を使用するテーブル、インデックス、またはパーティションの推定サイズ。該当する場合は既存の FILL FACTOR を適用し、断片化が生じていないことを前提としています。Estimated size of the table, index, or partition that uses the requested compression setting; and, if applicable, the existing fill factor, and assuming there is no fragmentation.
sample_size_with_current_compression_setting (KB)sample_size_with_current_compression_setting (KB) bigintbigint 現在の圧縮設定を使用するサンプルのサイズ。Size of the sample with the current compression setting. この列には、断片化も含まれます。This includes any fragmentation.
sample_size_with_requested_compression_setting (KB)sample_size_with_requested_compression_setting (KB) bigintbigint 要求された圧縮設定を使用して作成されたサンプルのサイズ。該当する場合は既存の FILL FACTOR を適用し、断片化は考慮していません。Size of the sample that is created by using the requested compression setting; and, if applicable, the existing fill factor and no fragmentation.


テーブルまたはパーティションの行、ページ、列ストアまたは列ストア アーカイブの圧縮を有効にしたときに発生するコスト削減を推定するには、sp_estimate_data_compression_savings を使用します。Use sp_estimate_data_compression_savings to estimate the savings that can occur when you enable a table or partition for row, page, columnstore or columnstore archive compression. たとえば、行の平均サイズを 40% 削減できれば、オブジェクトのサイズを 40% 削減できる可能性があります。For instance if the average size of the row can be reduced by 40 percent, you can potentially reduce the size of the object by 40 percent. これは FILL FACTOR と行サイズに左右されるため、領域を削減できない場合もあります。You might not receive a space savings because this depends on the fill factor and the size of the row. たとえば、長さ 8,000 バイトの行があり、そのサイズを 40% 削減したとしても、データ ページに収まるのは 1 行のみであることに変わりはないので、For example, if you have a row that is 8000 bytes long and you reduce its size by 40 percent, you can still fit only one row on a data page. 領域は削減されません。There is no savings.

sp_estimate_data_compression_savings を実行してテーブルが増大するという結果が示される場合は、テーブルの多くの行でデータ型の有効桁数がほとんど使用されており、圧縮された形式に必要なわずかなオーバーヘッドが積み重なって、圧縮による削減量を上回ることを意味しています。If the results of running sp_estimate_data_compression_savings indicate that the table will grow, this means that many rows in the table use almost the whole precision of the data types, and the addition of the small overhead needed for the compressed format is more than the savings from compression. このようなまれなケースでは、圧縮を使用しないでください。In this rare case, do not enable compression.

テーブルで圧縮が有効になっている場合は、sp_estimate_data_compression_savings を使用して、テーブルが圧縮されていない場合の平均行サイズを推定します。If a table is enabled for compression, use sp_estimate_data_compression_savings to estimate the average size of the row if the table is uncompressed.

この操作中に、テーブルで (IS) ロックが取得されます。An (IS) lock is acquired on the table during this operation. (IS) ロックを取得できない場合は、プロシージャがブロックされます。If an (IS) lock cannot be obtained, the procedure will be blocked. テーブルは、READ COMMITTED 分離レベルでスキャンされます。The table is scanned under the read committed isolation level.

要求された圧縮設定が現在の圧縮設定と同じである場合は、ストアド プロシージャが既存の FILL FACTOR を使用して、データが断片化されていない状態での推定サイズを返します。If the requested compression setting is same as the current compression setting, the stored procedure will return the estimated size with no data fragmentation and using the existing fill factor.

インデックス ID またはパーティション ID が存在しない場合は、結果が返されません。If the index or partition ID does not exist, no results are returned.


テーブルに対する SELECT 権限が必要です。Requires SELECT permission on the table.

制限事項と制約事項Limitations and Restrictions

SQL Server の 2019 の前に、この手順は、列ストア インデックスに適用されなかったし、そのため、データ圧縮パラメーター COLUMNSTORE と COLUMNSTORE_ARCHIVE が受け入れられませんでした。Prior to SQL Server 2019, this procedure did not apply to columnstore indexes, and therefore did not accept the data compression parameters COLUMNSTORE and COLUMNSTORE_ARCHIVE. SQL Server 2019 以降、列ストア インデックスができますを推定するためのソース オブジェクトと、要求された圧縮の種類の両方。Starting with SQL Server 2019, columnstore indexes can be used both as a source object for estimation, and as a requested compression type.

列ストア インデックスに関する考慮事項Considerations for Columnstore Indexes

列ストアと列ストア アーカイブの圧縮の両方を見積もる sp_estimate_compression_savings サポートに、SQL Server の 2019 以降します。Starting with SQL Server 2019, sp_estimate_compression_savings supports estimating both columnstore and columnstore archive compression. ページおよび行の圧縮とは異なり、オブジェクトに列ストア圧縮を適用することは新しい列ストア インデックスを作成する必要です。Unlike page and row compression, applying columnstore compression to an object requires creating a new columnstore index. この理由から、この手順の COLUMNSTORE と COLUMNSTORE_ARCHIVE オプションを使用する場合は、プロシージャに指定されたソース オブジェクトの種類は、圧縮サイズの推定に使用する列ストア インデックスの種類を決定します。For this reason, when using the COLUMNSTORE and COLUMNSTORE_ARCHIVE options of this procedure, the type of the source object provided to the procedure determines the type of columnstore index used for the compressed size estimate. 次の表は、参照を示しています。 ときに、各ソース オブジェクトの圧縮による削減量を推定するために使用するオブジェクト型、@data_compressionパラメーターは、列ストアまたは COLUMNSTORE_ARCHIVE のいずれかに設定されます。The following table illustrates the reference objects used to estimate compression savings for each source object type when the @data_compression parameter is set to either COLUMNSTORE or COLUMNSTORE_ARCHIVE.

ソース オブジェクトSource Object 参照オブジェクトReference Object
ヒープHeap クラスター化列ストア インデックスClustered columnstore index
クラスター化インデックスClustered index クラスター化列ストア インデックスClustered columnstore index
非クラスター化インデックスNon-clustered index 非クラスター化列ストア インデックスが (存在する場合は、キー列と指定された非クラスター化インデックスの付加列とテーブルのパーティション列を含む)Non-clustered columnstore index (including the key columns and any included columns of the provided non-clustered index, as well as the partition column of the table, if any)
非クラスター化列ストア インデックスNon-clustered columnstore index 非クラスター化列ストア インデックスを (指定された非クラスター化列ストア インデックスと同じ列を含む)Non-clustered columnstore index (including the same columns as the provided non-clustered columnstore index)
クラスター化列ストア インデックスClustered columnstore index クラスター化列ストア インデックスClustered columnstore index


Sp_estimate_compression_ 列ストア インデックスでサポートされていないデータ型を持つソース オブジェクト内の列がある場合は、行ストアのソース オブジェクト (クラスター化インデックス、非クラスター化インデックスまたはヒープ) からの列ストア圧縮を推定するときにコスト削減については、エラーで失敗します。When estimating columnstore compression from a rowstore source object (clustered index, non-clustered index or heap), if there are any columns in the source object that have a data type that is not supported in a columnstore index, sp_estimate_compression_savings will fail with an error.

同様に、ときに、@data_compressionパラメーターが NONE、行、またはページに設定されていると、ソース オブジェクトは、列ストア インデックスを次の表に、使用される参照オブジェクト。Similarly, when the @data_compression parameter is set to NONE, ROW, or PAGE and the source object is a columnstore index, the following table outlines the reference objects used.

ソース オブジェクトSource Object 参照オブジェクトReference Object
クラスター化列ストア インデックスClustered columnstore index ヒープHeap
非クラスター化列ストア インデックスNon-clustered columnstore index 非クラスター化インデックスが (付加列として存在する場合、キーの列およびテーブルのパーティション列として非クラスター化列ストア インデックスに含まれる列を含む)Non-clustered index (including the columns contained in the non-clustered columnstore index as key columns, and the partition column of the table, if any, as an included column)


列ストア オブジェクトのソースから行ストアの圧縮 (NONE、行またはページ) を推定するときに、元のインデックスが含まれていないこと 32 を超える列には行ストア (非クラスター化) インデックスではサポートされている制限してください。When estimating rowstore compression (NONE, ROW or PAGE) from a columnstore source object, be sure that the source index does not contain more than 32 columns as this is the limit supported in a rowstore (non-clustered) index.


次の例では、Production.WorkOrderRouting 圧縮を使用して ROW テーブルを圧縮した場合のサイズを推定します。The following example estimates the size of the Production.WorkOrderRouting table if it is compressed by using ROW compression.

USE AdventureWorks2012;  
EXEC sp_estimate_data_compression_savings 'Production', 'WorkOrderRouting', NULL, NULL, 'ROW' ;  

参照See Also

sys.partitions (Transact-SQL) sys.partitions (Transact-SQL)
データベース エンジン ストアド プロシージャ(TRANSACT-SQL) Database Engine Stored Procedures (Transact-SQL)
Unicode 圧縮の実装Unicode Compression Implementation