Các chỉ mục nén của SQL Server có còn được nén khi xây dựng lại mà không chỉ định nén dữ liệu không?


13

Sau khi xây dựng lại các chỉ mục SQL Server của họ bằng cách sử dụng nén trang ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)), việc xây dựng lại tiếp theo (như được thực hiện bởi một số tập lệnh bảo trì vượt qua ngưỡng phân mảnh nhất định) có cần chỉ định nén dữ liệu lại không? Các chỉ số có thể được giải nén một cách hiệu quả?

Câu trả lời:


22

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

nhập mô tả hình ảnh ở đây

Chọn bảng kiểm tra

nhập mô tả hình ảnh ở đây

Thêm một số cấp độ phân mảnh thử nghiệm.

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

Phần thú vị ở đây, khi xem báo cáo kế hoạch, là DATA_COMPRESSION = PAGEtùy chọn được thêm vào REBUILDlệ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

Tôi tình cờ thấy bạn đăng bài khi tôi thấy rằng 3 cơ sở dữ liệu tôi đã nén đều mất tính năng nén và tôi phải áp dụng lại. Là một phần của công việc đó, tôi đã thử nghiệm và xác nhận kết quả của bạn nhưng không biết điều này xảy ra như thế nào. Khả năng duy nhất khác mà tôi gặp phải là, nếu các chỉ mục bị vô hiệu hóa, chúng sẽ bị nén khi được xây dựng lại. Điều này dường như không phải là trường hợp, theo nhóm ETL của chúng tôi. Tôi cũng đã đặt ra câu hỏi này trên SQLServerCentral: sqlservercentral.com/Forums/2017336/Database-Lost-Compression Hoàn toàn không biết làm thế nào điều này xảy ra.
Marvel

Xin chào @Marvel, có thể là một số quy trình khác được tạo lại các chỉ mục trên cơ sở dữ liệu? Ví dụ, một số ứng dụng thực hiện 'nâng cấp' trong đó chúng thả và tạo vô số chỉ mục. Tuy nhiên tôi không nghĩ rằng bất kỳ ai cũng có thể đưa ra lời giải thích rõ ràng mà không cần biết thêm chi tiết. Lần tiếp theo, bạn có thể tìm thấy ngày tạo chỉ mục và tìm xem chúng có được tạo lại không (ví dụ: với truy vấn trong liên kết này: stackoverflow.com/questions/7579932/ . Nếu không, bạn luôn có thể hỏi như một câu hỏi nghĩ rằng bạn sẽ cần cung cấp thêm thông tin.
Randi Vertongen

1
Cảm ơn, Randi! Tôi đã thiết lập SCHema_OB DỰ_CHANGE_GROUP kiểm toán trên cơ sở dữ liệu nhưng điều này chắc chắn sẽ giúp tôi phân tích các bản ghi nhanh hơn. Tôi đã tìm thấy một trong những thủ phạm - chủ sở hữu của cơ sở dữ liệu, người yêu cầu nén đã liên tục sửa đổi bảng & chỉ mục. Anh ta đã không nhận ra rằng khi anh ta tạo các bảng mới và chuyển dữ liệu cũ vào & tạo các chỉ mục mới sẽ khiến việc nén bị mất. :( Tôi đã cung cấp cho anh ta cách chính xác để tạo các bảng và chỉ mục của anh ta. Tuy nhiên, tôi không nghĩ anh ta là thủ phạm duy nhất. Tôi không thể tưởng tượng rằng anh ta đã làm điều này với e
Marvel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.