web-dev-qa-db-ja.com

SQL Serverテーブルのデータがページ圧縮されているかどうかを確認するにはどうすればよいですか?

これは、私が昨日質問した質問の続きの質問です。 空のページ圧縮テーブルに一括挿入して完全圧縮できますか? その質問への回答(から引用) Randi Vertongenの優れた答えは)ですが、一括挿入ではテーブルレベルのロックを取得する必要があります。それ以外の場合、一括挿入は行レベルのロックを取得し、行データ圧縮のみを実行します。これは問題を提起します:どの圧縮が適用されたかを後でどのように知ることができますか?

理論的にはページ圧縮されたテーブルに行圧縮されたデータを作成する手順は次のとおりです。
1。 DATA_COMPRESSION=PAGEを使用してテーブルを作成し、sp_tableoptionを使用してこのテーブルの「一括読み込み時にテーブルロック」オプションをオンにしないでください。
2。 bcpを使用して、フラットファイルから新しいテーブルにデータを一括挿入しますが、-h TABLOCKオプションを指定せずにテーブルをロックします。

結果は、データが行レベルで圧縮されたテーブルです(非圧縮テーブルよりも小さいが、ページ圧縮テーブルよりも大きい)が、sys.allocation_unitsカタログテーブルを検査すると、データ圧縮がページとして示されます。

質問

このシナリオのように、テーブルのデータ割り当てがページ圧縮用である場合、データがテーブルはページ圧縮されていますか?

7
Caitlin M. Shaw

データページが実際に「ページ」圧縮されているかどうかを確認するには、文書化されていない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
13
Solomon Rutzky

圧縮レベルは 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;
0
Bob Klimes