Nén chỉ mục cụm so với nén bảng - chúng có giống nhau không?


8

Nếu tôi đặt nén (trang hoặc hàng) trên chỉ mục được nhóm của một bảng, thì có giống như cài đặt nén trên bảng không?

SQL Server cung cấp các tùy chọn để thực hiện cả hai, điều này cho thấy chúng khác nhau, nhưng tôi có ấn tượng rằng một chỉ mục được phân cụm và một bảng về cơ bản là giống nhau và mô hình tinh thần của tôi về cách các chỉ mục được phân cụm cho tôi biết rằng việc nén chỉ mục được phân cụm cũng phải nén bảng.

Câu trả lời:


11

Nếu tôi đặt nén (trang hoặc hàng) trên chỉ mục được nhóm của một bảng, thì có giống như cài đặt nén trên bảng không?

Đúng.

Từ MSDN :

Sử dụng cú pháp REBUILD VỚI để xây dựng lại toàn bộ bảng bao gồm tất cả các phân vùng trong bảng được phân đoạn. Nếu bảng có chỉ mục được nhóm, tùy chọn REBUILD sẽ xây dựng lại chỉ mục được nhóm.


SQL Server cung cấp các tùy chọn để thực hiện cả hai, điều này cho thấy rằng chúng khác nhau

Lý do tại sao cả hai cú pháp tồn tại là vì một bảng không nhất thiết phải có một chỉ mục được nhóm. Nói cách khác, ALTER INDEX ALL ON ... REBUILDkhông ảnh hưởng đến một đống (mặc dù nó sẽ chạm vào tất cả những người không độc quyền), vì vậy tuyến đường khác phục vụ mục đích đó.

Ngoài ra, trong khi các tài liệu hướng dẫn không rõ ràng nói như vậy, các ALTER TABLE ... REBUILDcú pháp không không cho phép / vô hiệu hóa nén của tất cả nonclustered chỉ số trên bàn. Nó chỉ ảnh hưởng đến heap hoặc chỉ số cụm.

Cuối cùng, nếu bạn đang kiểm tra điều này thông qua SSMS, hãy lưu ý rằng bạn có thể gặp lỗi khi tắt tính năng nén - tập lệnh để bạn có thể thấy những gì đang thực sự xảy ra.


Cảm ơn Jon, giải thích rõ ràng tốt! Và thật tốt khi biết rằng mọi thứ hoạt động như tôi mong đợi họ nên làm (điều này chắc chắn không phải luôn luôn như vậy!)
paulH

4

Chỉ số cụm là bảng. Vì vậy, đặt nó trên một trong hai là như nhau. Bạn có thể xác nhận điều này bằng cách so sánh cả hai trường hợp ở đây:

SELECT OBJECT_NAME(p.object_id),*
 FROM sys.partitions AS p
 INNER Join sys.indexes AS i 
 ON p.object_id = i.object_id 
 AND p.index_id = i.index_id
 WHERE p.data_compression > 0;

SQL Server cũng cung cấp một số cách khác nhau để tạo một cột duy nhất:

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...hoặc là...

CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));

...hoặc là...

CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);

...hoặc là...

CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);

Tất cả sẽ kết thúc với cùng một triển khai cơ bản (với các tên khác nhau).

Chỉ vì có nhiều cách khác nhau để đi làm không có nghĩa là bạn vẫn không đến văn phòng. :-)

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.