Sự khác biệt giữa nén trên PK so với trên Bảng là gì?


9

Nén dữ liệu có thể được đặt trên bảng:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 )
) ON SomePartitionScheme(SomeId) WITH (DATA_COMPRESSION=PAGE)

Và nó có thể được định nghĩa trên khóa Chính:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 ) WITH (DATA_COMPRESSION=PAGE)
) ON SomePartitionScheme(SomeId) 

Nhưng nếu bạn đặt nó trên cả hai thì bạn sẽ gặp lỗi này:

Tùy chọn DATA_COMPRESSION được chỉ định nhiều lần cho bảng hoặc cho ít nhất một trong các phân vùng của nó nếu bảng được phân vùng.

Có sự khác biệt nào khi đưa nó lên PK vs trên bàn không?


Bạn có nghĩ rằng sẽ có một sự khác biệt nếu khóa chính không phải là cột của cụm? :)
LowlyDBA

1
@ John: Tôi đoán vậy, nhưng tôi không biết. (Đó là lý do tại sao tôi hỏi :)
Vaccano

Câu trả lời:


14

Đây không phải là vấn đề đặt nén vào khóa chính, mà thay vào đó là vấn đề đặt nén trên chỉ mục cụm . Đối với SQL Server, một chỉ mục được nhóm đang tổ chức cấu trúc vật lý của bảng trên chỉ mục đó. Hoặc, ở dạng ngắn hơn, chỉ mục cụm là bảng. Điều này có nghĩa là nén chỉ mục cụm và nén bảng tương đương về chức năng. Nếu bạn đã tạo khóa chính của mình dưới dạng một chỉ mục không được nhóm và giữ bảng cơ sở dưới dạng một đống, hai cấu trúc này sẽ khác nhau và được nén riêng.


Điều gì sẽ xảy ra nếu, bất chấp tất cả sự hợp lý, bạn đã biến khóa chính của mình thành một chỉ mục không được phân cụm và tạo một chỉ mục được phân cụm khác nhau? Nén sau đó sẽ được như vậy một lần nữa?
Ross Presser

1
Nó sẽ không. Đừng nghĩ về khóa chính ở đây, nó không liên quan. Chúng ta cần tập trung vào các chỉ mục ở đây, phân cụm và không phân cụm. Bạn không thể nén riêng một chỉ mục được nhóm và một bảng vì chúng là cùng một đối tượng. các chỉ mục / bảng được nhóm và các chỉ mục không được phân cụm là các đối tượng khác nhau và phải được nén riêng lẻ.
Mike Fal

Tôi thể hiện bản thân rất tệ. Câu trả lời của bạn chính xác là những gì tôi đang lái xe - chỉ mục được nhóm có thể được nén (bất kể nó đang được lập chỉ mục) hoặc heap có thể được nén (nếu không có chỉ mục được nhóm), không phải cả hai. Và một chỉ mục không cụm cũng có thể được nén, riêng biệt.
Ross Presser

Chính xác, nhưng để rõ ràng, bạn không thể có một đống và một chỉ mục được nhóm trên cùng một bảng. Đó là cái này hay cái khác. Do cách thức hoạt động của SQL Server, mọi người thường nhầm lẫn các khóa chính với các chỉ mục được nhóm, vì vậy tôi muốn đảm bảo sự khác biệt được hiểu cho câu trả lời này.
Mike Fal
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.