SQL Serverの圧縮インデックスは、データ圧縮を指定せずに再構築時に圧縮されたままですか?


13

ページ圧縮(ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE))を使用してSQL Serverインデックスを再構築した後、(特定の断片化しきい値を超えた一部のメンテナンススクリプトで行われるように)その後の再構築では、データ圧縮を再度指定する必要がありますか?そうでなければ、インデックスは効果的に圧縮解除されますか?

回答:


22

インデックスは、再構築/再編成するときに圧縮されたままになります。

テーブルと圧縮インデックスを作成する

 CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
 CREATE INDEX IX1 ON dbo.TEST_INDX(id)  WITH (DATA_COMPRESSION = PAGE);

チェック圧縮

 SELECT i.name, p.data_compression_desc 
 FROM sys.partitions P
 INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
 WHERE P.data_compression > 0 and I.name = 'IX1';

結果

name    data_compression_desc
IX1     PAGE

インデックスを再構築する

ALTER INDEX IX1 on  DBO.TEST_INDX rebuild 

チェック圧縮

 SELECT i.name, p.data_compression_desc 
 FROM sys.partitions P
 INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
 WHERE P.data_compression > 0 and I.name = 'IX1'

結果

name    data_compression_desc
IX1     PAGE

これらを無効にしてから再構築すると、異なる結果になります。無効にすると、インデックス定義が維持されたままインデックスが削除されるためです。

alter index IX1 on  DBO.TEST_INDX DISABLE ;
alter index IX1 on  DBO.TEST_INDX REBUILD ;

結果

name    data_compression_desc

圧縮が失われ、インデックス作成スクリプトを適合させずにSSMSを介してインデックスをドロップおよび作成すると、圧縮定義も失われます。

どうして?

インデックス作成ステートメントのスクリプトを作成するとき、data_compressionオプションは保持されないためです。

ただし、インデックスを無効にした場合、圧縮して再構築し、再度再構築します。

alter index IX1 on  DBO.TEST_INDX DISABLE ;
alter index IX1 on  DBO.TEST_INDX REBUILD  WITH (DATA_COMPRESSION = PAGE);
alter index IX1 on  DBO.TEST_INDX REBUILD;

結果

name    data_compression_desc
IX1 PAGE

Ola hallengrenのメンテナンスソリューションを使用した再構築のテスト

パラメーターはテスト目的で変更されます。

MinNumberOfPagesパラメーターに必要なため、いくつかのデータを追加して1ページに移動します。

INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10 

インデックス最適化プロシージャを実行して、ステートメントを出力します。

EXECUTE dbo.IndexOptimize
@Databases = 'TestDB',
@FragmentationLow = 'INDEX_REBUILD_ONLINE',
@FragmentationMedium = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@Indexes = 'TestDB.DBO.TEST_INDX',
@Execute = 'N',
@MinNumberOfPages = 1;

結果:

Command: ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)

Comment: ObjectType: Table, IndexType: NonClustered, ImageTex
t: No, NewLOB: No, FileStream: No, ColumnStore: No, AllowPageLocks: Yes, PageCount: 1, Fragmentation: 0
Outcome: Not Executed
Duration: 00:00:00
Date and time: 2019-01-09 14:48:12

生成されたコマンドの実行

ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)

圧縮は保持されます

name    data_compression_desc
IX1 PAGE

メンテナンスプランを使用した再構築のテスト(olaのソリューションを強く主張します)

インデックスを再構築する

ここに画像の説明を入力してください

テストテーブルを選択してください

ここに画像の説明を入力してください

いくつかのテストフラグメンテーションレベルを追加します。

ここに画像の説明を入力してください

いくつかの値を挿入して、断片化を進めます

INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4

断片化の割合を確認する

SELECT 
I.[name] AS  INDX ,
IPS.avg_fragmentation_in_percent,
IPS.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('[dbo].[TEST_INDX]'), NULL, NULL, NULL) AS IPS
INNER JOIN sys.indexes AS I ON I.[object_id] = IPS.[object_id]
AND IPS.index_id = I.index_id
WHERE IPS.database_id = DB_ID()
and I.name = 'IX1'

結果

INDX    avg_fragmentation_in_percent    page_count
IX1 66,6666666666667    3

計画を実行する

ここに画像の説明を入力してください

ここで興味深いのは、計画レポートを見るときDATA_COMPRESSION = PAGE、生成されたREBUILDコマンドにオプションが追加されることです!

Command:USE [TestDB]
GO
ALTER INDEX [IX1] ON [dbo].[TEST_INDX] REBUILD PARTITION = ALL WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, RESUMABLE = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, DATA_COMPRESSION = PAGE)

断片化:

INDX    avg_fragmentation_in_percent    page_count
IX1 0   2

圧縮:

name    data_compression_desc
IX1 PAGE

圧縮した3つのデータベースがすべて圧縮を失い、再適用する必要があることがわかったときに、私はあなたの投稿に出会いました。その作業の一環として、私はあなたの結果をテストして確認しましたが、これがどのように起こったのか分かりません。私が遭遇した他の唯一の可能性は、インデックスが無効になっている場合、再構築時に圧縮が失われることです。ETLチームによると、これは事実ではないようです。:私はまたSQLServerCentralにこの質問提起しましたsqlservercentral.com/Forums/2017336/Databases-Lost-Compressionを完全にこれが起こったのかについての損失で。
マーベル

こんにちは@Marvel、他のプロセスがデータベースのインデックスを再作成した可能性がありますか?たとえば、いくつかのアプリケーションは、数え切れないほどのインデックスを削除して作成する「アップグレード」を行います。しかし、私は誰もこれ以上詳細なしに明確な説明をすることができるとは思いません。次回、インデックスの作成日を見つけて、それらが再作成されたかどうかを見つけることができます(たとえば、このリンクのクエリで:stackoverflow.com/questions/7579932/…。あなたはより多くの情報を提供する必要があると思う
ランディVertongen

1
ランディ、ありがとう!データベースにSCHEMA_OBJECT_CHANGE_GROUP監査を設定しましたが、これは間違いなくログをより速く解析するのに役立ちます。データベースの所有者である圧縮者を見つけました。圧縮を要求したのは、テーブルとインデックスを絶えず変更しているからです。彼は、新しいテーブルを作成し、古いデータを移動し、新しいインデックスを作成すると、圧縮が失われることを理解していませんでした。:(私は彼のテーブル&インデックスを作成するための正しい方法で彼を提供してきた私はしかし、彼は唯一の犯人だとは思わない、私は彼が電子にこれを行っていることを想像することはできません。。
マーベル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.