これは、私が昨日質問した質問の続きの質問です。 空のページ圧縮テーブルに一括挿入して完全圧縮できますか? その質問への回答(から引用) Randi Vertongenの優れた答えは)ですが、一括挿入ではテーブルレベルのロックを取得する必要があります。それ以外の場合、一括挿入は行レベルのロックを取得し、行データ圧縮のみを実行します。これは問題を提起します:どの圧縮が適用されたかを後でどのように知ることができますか?
理論的にはページ圧縮されたテーブルに行圧縮されたデータを作成する手順は次のとおりです。
1。 DATA_COMPRESSION=PAGE
を使用してテーブルを作成し、sp_tableoption
を使用してこのテーブルの「一括読み込み時にテーブルロック」オプションをオンにしないでください。
2。 bcpを使用して、フラットファイルから新しいテーブルにデータを一括挿入しますが、-h TABLOCK
オプションを指定せずにテーブルをロックします。
結果は、データが行レベルで圧縮されたテーブルです(非圧縮テーブルよりも小さいが、ページ圧縮テーブルよりも大きい)が、sys.allocation_units
カタログテーブルを検査すると、データ圧縮がページとして示されます。
質問
このシナリオのように、テーブルのデータ割り当てがページ圧縮用である場合、データがテーブルはページ圧縮されていますか?
データページが実際に「ページ」圧縮されているかどうかを確認するには、文書化されていないDMF sys.dm_db_database_page_allocations()
を使用できます。 is_page_compressed
フィールドには、探している情報が含まれています。 DETAILED
モード(つまり、5番目のパラメーター)を使用する必要があります。そうしないと、そのフィールドの値はすべてNULL
になります。
明確にするために(質問の言い回しに基づいて、「そのテーブルのdataがページ圧縮されているかどうかを調べるにはどうすればよいですか?」)、これはすべてではありません。なしの問題:ページ圧縮が適用されます各データページごと、つまり、圧縮されたもの、すべてが圧縮されたもの、またはそれらの間の任意の組み合わせを持つことができます。したがって、すべてのページを確認する必要があります。そして、いいえ、必ずしもページが圧縮されていない単一のページがREBUILD
が必要であることを示しているとは限りません。
例えば:
SELECT [is_page_compressed]
FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID(N'dbo.CompressedHeap'),
0, 1, 'DETAILED');
以下は、データページが最初はページ圧縮されていないが、REBUILD
操作の後であることを示しています。
USE [tempdb];
-- DROP TABLE dbo.CompressedHeap;
CREATE TABLE dbo.CompressedHeap
(
ID INT IDENTITY(1, 1) NOT NULL,
String sysname,
[MaxLength] SMALLINT,
[Type] VARCHAR(5)
) WITH (DATA_COMPRESSION = PAGE);
INSERT INTO dbo.CompressedHeap ([String], [MaxLength], [Type])
SELECT col.[name], col.[max_length], obj.[type]
FROM master.sys.columns col
CROSS JOIN master.sys.objects obj;
SELECT [is_page_compressed], *
FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID(N'dbo.CompressedHeap'),
0, 1, 'DETAILED')
WHERE [is_iam_page] = 0
AND [is_allocated] = 1;
-- 394 pages
ALTER TABLE dbo.CompressedHeap REBUILD;
SELECT [is_page_compressed], *
FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID(N'dbo.CompressedHeap'),
0, 1, 'DETAILED')
WHERE [is_iam_page] = 0
AND [is_allocated] = 1;
-- 179 pages
圧縮レベルは sys.partitions dmvで確認できます
SELECT t.name AS tablename,
i.name AS indexname,
p.data_compression_desc
FROM sys.tables AS t
INNER JOIN sys.indexes AS i
ON t.object_id = i.object_id
INNER JOIN sys.partitions AS p
ON i.object_id = p.object_id
AND i.index_id = p.index_id;