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를 통해 인덱스를 삭제하고 작성할 때 압축 정의도 유실됩니다.

왜?

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

내가 압축 한 3 개의 데이터베이스가 모두 압축을 잃어 버렸고 다시 적용해야한다는 것을 알았을 때 게시물을 보았습니다. 그 일의 일환으로, 나는 당신의 결과를 테스트하고 확인했지만 이것이 어떻게 발생했는지 전혀 모른다. 내가 만날 수있는 유일한 다른 가능성은 인덱스가 비활성화되면 다시 빌드 할 때 압축이 손실된다는 것입니다. ETL 팀에 따르면 그렇지 않은 것 같습니다. 나는 또한 SQLServerCentral 에서이 질문을 제기했습니다 : sqlservercentral.com/Forums/2017336/Databases-Lost-Compression 이 일이 어떻게 발생했는지 완전히 상실했습니다.
Marvel

안녕하세요 @Marvel, 다른 프로세스가 데이터베이스에서 인덱스를 다시 생성했을 수 있습니까? 예를 들어 일부 응용 프로그램은 수많은 인덱스를 삭제하고 생성하는 '업그레이드'를 수행합니다. 그러나 나는 아무도 더 자세한 설명없이 명확한 설명을 줄 수 있다고 생각하지 않습니다. 다음 번에 색인 생성 날짜를 찾아서 다시 생성 한 위치를 찾을 수 있습니다 (예 :이 링크의 쿼리 : stackoverflow.com/questions/7579932/… . 그렇지 않은 경우 항상 질문 할 수는 있지만, 더 많은 정보를 제공해야한다고 생각하십시오
Randi Vertongen

1
고마워, 랜디! 데이터베이스에 SCHEMA_OBJECT_CHANGE_GROUP 감사를 설정했지만 로그를 더 빨리 구문 분석하는 데 도움이됩니다. 나는 이미 데이터베이스 소유자 인 범인 중 하나를 찾았습니다. 압축을 요청한 사람은 테이블과 인덱스를 지속적으로 수정하고 있습니다. 그는 새 테이블을 만들거나 이전 데이터를 옮기고 새 인덱스를 만들 때 압축이 손실 될 것이라는 것을 알지 못했습니다. :( 나는 그의 테이블 및 인덱스를 생성 할 수있는 올바른 방법을 그에게 제공 한 나는 그러나, 그는 유일한 원인이라고 생각하지 않습니다 나는 그가 전자에 이런 짓을했다고 상상할 수 없다..
마블
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.