Các chỉ mục vẫn được nén khi xây dựng lại / sắp xếp lại chúng.
Tạo bảng và chỉ mục nén
CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
CREATE INDEX IX1 ON dbo.TEST_INDX(id) WITH (DATA_COMPRESSION = PAGE);
Kiểm tra nén
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';
Kết quả
name data_compression_desc
IX1 PAGE
Xây dựng lại chỉ mục
ALTER INDEX IX1 on DBO.TEST_INDX rebuild
Kiểm tra nén
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'
Kết quả
name data_compression_desc
IX1 PAGE
Vô hiệu hóa chúng và sau đó xây dựng lại có một kết quả khác, vì vô hiệu hóa loại bỏ chỉ mục, trong khi vẫn giữ định nghĩa chỉ mục.
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD ;
Kết quả
name data_compression_desc
Nén đã bị mất, định nghĩa nén cũng sẽ bị mất khi thả và tạo chỉ mục qua SSMS mà không điều chỉnh tập lệnh tạo Index.
Tại sao?
Bởi vì tùy chọn data_compression không được giữ lại khi viết kịch bản lệnh tạo Index.
tuy nhiên, nếu chúng ta vô hiệu hóa chỉ mục, hãy xây dựng lại với nén và sau đó xây dựng lại:
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;
Kết quả
name data_compression_desc
IX1 PAGE
Thử nghiệm xây dựng lại với giải pháp bảo trì của Ola hallengren
Các thông số được sửa đổi cho mục đích thử nghiệm.
Thêm một số dữ liệu để vào một trang, vì nó cần thiết cho tham số MinNumberOfPages.
INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10
Thực hiện chỉ số tối ưu hóa Proc để in ra tuyên bố.
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;
Kết quả:
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
Thực hiện lệnh được tạo
ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
Nén được giữ lại
name data_compression_desc
IX1 PAGE
Thử nghiệm xây dựng lại với một kế hoạch bảo trì (tôi rất muốn tranh luận về giải pháp của ola)
Xây dựng lại chỉ mục
Chọn bảng kiểm tra
Thêm một số cấp độ phân mảnh thử nghiệm.
Chèn một số giá trị để có được sự phân mảnh
INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4
Kiểm tra tỷ lệ phân mảnh
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'
Kết quả
INDX avg_fragmentation_in_percent page_count
IX1 66,6666666666667 3
Chạy kế hoạch
Phần thú vị ở đây, khi xem báo cáo kế hoạch, là DATA_COMPRESSION = PAGE
tùy chọn được thêm vào REBUILD
lệnh được tạo !
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)
Phân mảnh:
INDX avg_fragmentation_in_percent page_count
IX1 0 2
Nén:
name data_compression_desc
IX1 PAGE