페이지 압축 ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
)을 사용하여 SQL Server 인덱스를 재 구축 한 후 , 일부 재 구축 스크립트 (특정 조각화 임계 값을 지난 과거의 재 구축)에서 데이터 압축을 다시 지정해야합니까? 그렇지 않으면 인덱스가 효과적으로 압축 해제됩니까?
페이지 압축 ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
)을 사용하여 SQL Server 인덱스를 재 구축 한 후 , 일부 재 구축 스크립트 (특정 조각화 임계 값을 지난 과거의 재 구축)에서 데이터 압축을 다시 지정해야합니까? 그렇지 않으면 인덱스가 효과적으로 압축 해제됩니까?
답변:
인덱스는 다시 작성 / 구성 할 때 압축 상태를 유지합니다.
테이블 및 압축 인덱스 작성
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를 통해 인덱스를 삭제하고 작성할 때 압축 정의도 유실됩니다.
왜?
Index create 문을 스크립팅 할 때 data_compression 옵션이 유지되지 않기 때문입니다.
그러나 index를 비활성화하면 압축을 사용하여 다시 작성하고 다시 작성하십시오.
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 매개 변수에 필요하므로 일부 페이지를 추가하여 한 페이지로 이동하십시오.
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