ดัชนียังคงถูกบีบอัดเมื่อสร้างใหม่ / จัดระเบียบใหม่
สร้างตารางและดัชนีที่บีบอัด
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 จะไม่ถูกเก็บไว้เมื่อทำการสคริปต์คำสั่ง Index create
อย่างไรก็ตามหากเราปิดการใช้งานดัชนีให้สร้างใหม่ด้วยการบีบอัดแล้วสร้างใหม่อีกครั้ง:
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