Có phải khóa phân vùng cũng phải là một phần của khóa chính?


24

Tôi đang phân vùng một bảng dựa trên một cột không phải là khóa chính? Tôi đã đọc một số thông tin mâu thuẫn ngày hôm nay về việc cột phân vùng phải là một phần của khóa chính. Ruột của tôi nói không, nhưng tôi không chắc chắn 100%. Vì vậy, câu hỏi ...

  1. Cột phân vùng phải là một phần của chính? Nó được đề nghị theo cách này hay cách khác?
  2. Tôi có phải tạo một chỉ mục cho khóa phân vùng hay DBMS tự động làm nó không?

Câu trả lời:


11

Không có gì.

Một trong những tình huống phổ biến nhất để phân vùng là sử dụng trường ngày, hoàn toàn không liên quan đến PK của bạn.

Chẳng hạn, nếu bạn có một bảng Ordersvới trường, OrderDaterất có thể bạn sẽ phân vùng dựa trên tháng và năm OrderDate.

Khi các bản ghi bị cũ và không còn phù hợp, bạn có thể chuyển các phân vùng đó sang bảng lưu trữ hoặc cơ sở dữ liệu để chúng không còn được xử lý.

Phân vùng sẽ hoạt động với hầu hết mọi trường, nhưng để nó hoạt động, WELL (các) trường mà phân vùng của bạn nên được sử dụng trong hầu hết, nếu không phải tất cả, các truy vấn của bạn. Nếu bạn không bao gồm các khóa phân vùng thì về cơ bản bạn sẽ có được một bảng quét đắt tiền đi qua nhiều bảng (phân vùng).

CHỈNH SỬA

Đối với phần 2, tôi nghĩ rằng câu trả lời là không tốt. Khóa phân vùng được sử dụng để xác định phân vùng nào sẽ đặt hàng vào, nhưng tôi không nghĩ rằng một chỉ mục được duy trì. Có thể có số liệu thống kê ở mặt sau trên đó mặc dù.


10
Tôi biết điều này đã cũ, nhưng nó dẫn tôi xuống một con đường sai lầm nên tôi nghĩ tôi sẽ bình luận cho người khác. Cột phân vùng phải nằm trong Khóa chính nếu bạn muốn sử dụng các khả năng SWITCH của tính năng Phân vùng. Nếu nó không nằm trong khóa chính, bạn sẽ gặp lỗi này: Partition columns for a unique index must be a subset of the index key.
Vaccano

Tôi đồng ý với @Vaccano
san

3

Ngoài câu trả lời của JNK, có lẽ bạn nên đọc bài viết này thảo luận về việc căn chỉnh các phân vùng bảng và phân vùng chỉ mục.

Có nhiều loại kịch bản trong đó lược đồ phân vùng thực hiện chính xác theo cột đầu tiên của khóa chính - ví dụ trong kịch bản kho dữ liệu trong đó ngày chụp nhanh của bảng thực tế thường là cột phân vùng cũng như cột đầu tiên trong khóa chính.

Nhưng cũng như vậy, trong các môi trường OLTP nơi PK là IDENTITY hoặc khóa thay thế khác, việc sử dụng nó cho phân vùng này rất ít có ý nghĩa, vì phân vùng trên các số tùy ý thường không hữu ích lắm. Trong các hệ thống OLTP, bạn cũng có xu hướng phân vùng theo ngày nhiều nhất (có thể không phải trong PK), nhưng cũng có khả năng theo khu vực hoặc theo một bộ phận tổ chức nào đó (có thể trong PK nếu bạn không sử dụng thay thế).

Nhưng nó không phải là một yêu cầu.


Vâng, rất nhiều thứ không phải là một yêu cầu. Ngay cả lập chỉ mục không phải là một yêu cầu! Để có ý nghĩa về mặt chức năng, việc phân vùng phải được thực hiện trên cột hàng đầu của khóa ứng viên. Nếu không, kiến ​​trúc sư ứng dụng sẽ sử dụng bảng như thế nào?
srini.venigalla

@ srini.venigalla Đó là một trường hợp phổ biến, nhưng một trường hợp phổ biến khác (cũng vậy?) là phân vùng trên một cái gì đó không phải là một phần của khóa chính hoặc ứng cử viên - vì phân vùng thường được sử dụng để lưu trữ, ngày hết hạn có thể một lựa chọn phân vùng tốt. Nhưng không có gì ngụ ý rằng đó có thể là một phần của chìa khóa. Phân vùng là một tính năng cấp thấp khá chung chung và có ít nhất hai mô hình sử dụng khác biệt và mâu thuẫn ở đây, cả hai đều có các thực tiễn tốt nhất hợp pháp xung quanh chúng.
Cade Roux

0

Nó phải là một phần của Khóa Ứng viên nếu không phải là một phần của Khóa chính. Ý tưởng là, phân vùng của bạn nên căn chỉnh chính với khóa chính.

Vì vậy, câu trả lời là, vâng, nó được ưu tiên là một phần của PK. Nếu không phải là một chìa khóa khác, cũng đủ tốt để trở thành một PK.


Chưa bao giờ nghe nói về Khóa Ứng viên. Làm thế nào để chỉ định nó trong câu lệnh Tạo / Thay đổi?
AngryHacker

Khóa ứng viên chỉ là một khóa khác đủ điều kiện để trở thành Khóa chính. Ví dụ: ID là khóa chính. Nhưng trong cùng một bảng, nếu một cột khác chẳng hạn. PERSON_ID cũng có thể xác định duy nhất một hàng, được gọi là Khóa Ứng viên. Các quy tắc chuẩn hóa thứ 2 và thứ 3 cũng phải tuân theo tất cả các khóa ứng cử viên.
srini.venigalla

Hiểu. Còn phần 2 của câu hỏi của tôi thì sao?
AngryHacker

Giống như bất kỳ chỉ số khác. ví dụ: TẠO INDEX IX_ ProducttVendor_VendorID TRÊN Mua hàng. ProducttVendor (BusinessEntityID);
srini.venigalla

4
Điều này là hoàn toàn không chính xác. Bạn có thể phân vùng trên nhiều trường không liên quan đến PK, chẳng hạn như OrderDate. Bạn có bất cứ điều gì để sao lưu yêu cầu của bạn?
JNK
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.