Ý nghĩa của việc sử dụng Chỉ mục NonClustered duy nhất với Cột che thay vì Khóa chính


12

Chúng tôi có một bảng lớn [MyTable]mà hiện nay có cả Primary Key, một Unique Non Clustered Indextrên cùng một cột ( [KeyColumn]). Chỉ số U NC cũng có các cột che bổ sung.

Có cả PK và Chỉ số NC duy nhất trên cùng một cột có vẻ dư thừa, vì vậy tôi đã xem xét xóa Khóa chính và thay vào đó sử dụng chỉ mục Không phân cụm duy nhất cho mục đích toàn vẹn tham chiếu.

Lưu ý rằng bảng được nhóm hoàn toàn bởi một cột khác.

tức là chúng ta có:

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO

Theo như tôi biết, không thể thêm các cột che vào Khóa chính, vì vậy tôi dự định sẽ làm:

  • Bỏ các ràng buộc khóa ngoại dựa vào MyTable.KeyColumn
  • Bỏ khóa chính MyTable.KeyColumnhoàn toàn
  • Thêm lại các khóa ngoại vào bảng (tức là RI sẽ được thực thi thông qua MyTable.KeyColumn)

Hàm ý duy nhất tôi có thể nghĩ đến khi làm điều này là chúng ta sẽ không nhận được biểu tượng khóa trực quan trên sơ đồ ERD của mình và mật độ chỉ số (lá) sẽ ít hơn do các cột được bao gồm.

Tôi đã đọc /programming/487314/primary-key-or-unique-index và hài lòng với tính toàn vẹn và hiệu suất của việc này.

Câu hỏi của tôi là: Cách tiếp cận này có thiếu sót?

Chỉnh sửa những gì tôi đang cố gắng thực hiện : Tối ưu hóa hiệu suất và làm sạch mùa xuân . Bằng cách xóa PK hoặc Chỉ mục, sẽ có ít trang cần thiết hơn cho chỉ mục của tôi = ghi nhanh hơn, cộng với lợi ích bảo trì / vận hành, tức là chỉ số ít hơn để giữ phân mảnh, v.v.

Để đặt một số nền tảng cho điều này, trước đây tôi chưa bao giờ có một bảng được tham chiếu, không có PK. Tuy nhiên, thực tế là một Chỉ số NC với các cột che được thêm vào bảng có nghĩa là tôi cần điều chỉnh suy nghĩ của mình.


Bạn có thể nhận xét về những gì bạn đang cố gắng để đạt được? Bạn cũng nên đảm bảo rằng bạn kết thúc với một chỉ mục được nhóm vào cuối.

@ jn29098 - Đã cập nhật. Xác nhận rằng chúng tôi có một chỉ mục được nhóm, trên các cột không phải là PK cũng không phải là cột che, vì vậy điều này dường như không liên quan đến quyết định này.
StuartLC

1
Bạn có chắc chắn rằng bạn không có bất kỳ công cụ / ORM / công cụ mô hình hóa dữ liệu nào sẽ không hoạt động khi thấy PK biến mất?
Remus Rusanu

Nhược điểm duy nhất tôi thấy là một khi PK đã biến mất..vậy bạn chỉ có một chỉ mục trên keycolumn và các truy vấn đang sử dụng chỉ mục PK nói để quét chỉ mục trên keycolumn hoặc đặt hàng bởi keycolumn và không được bao phủ bởi chỉ số Uniuqe có thể tăng thêm một chút IO vì các trang lá chỉ mục duy nhất nhiều hơn so với PK. Mặt khác, nó trông ổn. Nhưng một số người theo chủ nghĩa thuần túy sẽ nói rằng bạn nên có PK :)
Gulli Meel

1
Tôi sẽ đề nghị bạn kiểm tra tính hữu ích của chỉ mục đó bằng cách sử dụng chỉ số sử dụng chỉ số DMV và xem liệu nó có đang được sử dụng bởi một số truy vấn của bạn hay không. chỉ số ..
Gulli Meel

Câu trả lời:


3

Tối ưu hóa hiệu suất. Bằng cách xóa PK hoặc Chỉ mục, sẽ có ít trang cần thiết hơn cho chỉ mục của tôi = ghi nhanh hơn, cộng với lợi ích bảo trì / vận hành, tức là chỉ số ít hơn để giữ phân mảnh, v.v.

Bạn cần có khả năng chứng minh rằng những gì được đề xuất sẽ thực sự có ích (chi phí so với lợi ích). Vì lý do gì mà sự thay đổi này đang được xem xét? Có thực sự có vấn đề về hiệu suất với bảng này không, hay nó chỉ "nhìn sai"?

Dưới đây là một số câu hỏi khác sẽ giúp bạn đi đến quyết định tốt nhất cho môi trường của bạn:

  • Bao nhiêu thời gian sẽ được lưu trong cửa sổ bảo trì? Trong cửa sổ sao lưu?

  • Bao nhiêu dung lượng lưu trữ này sẽ tiết kiệm (tệp dữ liệu, tệp nhật ký, sao lưu, v.v.)?

  • INSERThiệu suất trên bảng này thực sự là một nút cổ chai ngay bây giờ? Nó sẽ cải thiện bao nhiêu? Là loại bỏ một chỉ số là chiến lược tốt nhất để khắc phục vấn đề đó?

  • Điều này có gây ra sự cố với các công cụ cơ sở dữ liệu và khung (đặc biệt là ORM) mà mỗi bảng mong muốn có một khóa chính chứ không chỉ là một chỉ mục duy nhất không? Bản sao giao dịch yêu cầu một khóa chính trên các bảng được công bố.

  • Là một lược đồ cơ sở dữ liệu tự tài liệu quan trọng?

  • Mặc dù hạn chế sử dụng, nhưng sự hẹp hòi của chỉ số khóa chính vẫn cho phép trình tối ưu hóa tạo ra các kế hoạch hiệu quả hơn cho các truy vấn nhất định? (Sử dụng sys.dm_db_index_usage_statsđể tìm hiểu.)

Nói một cách cá nhân, từ những gì bạn đã nói với chúng tôi, tôi sẽ để nó một mình cho đến khi có thể chứng minh rằng cả hai (a) chỉ số phụ là một vấn đề và (b) loại bỏ nó là giải pháp.


Cảm ơn - hóa ra các chỉ số chỉ số cho thấy PK vẫn được sử dụng nhiều để quét. Có vẻ như tôi đã quá hăng hái - lợi ích dễ đọc / quy ước của việc giữ lại PK sẽ vượt xa mọi tác động lưu trữ trong thời gian dài. Tuy nhiên, vấn đề về sao chép giao dịch sẽ giải quyết vấn đề này - chúng tôi S need cần sớm sao chép cơ sở dữ liệu này.
StuartLC

2

Loại truy vấn duy nhất trên bảng đó sẽ hoạt động kém hơn (và chỉ kém hơn một chút) sẽ là những truy vấn yêu cầu một loạt các giá trị KeyColumn - vì các truy vấn đó vào lúc này sẽ được phục vụ tốt nhất bởi một chỉ mục tìm kiếm trên PK của bạn.

Điều đáng ghi nhớ là chi phí kiểm tra tính toàn vẹn tham chiếu cho các bảng tham chiếu bảng này sẽ cao hơn (chỉ cao hơn một chút).

Miễn là bạn quan tâm đến khía cạnh vô giá trị, thì bạn sẽ ổn với chỉ số một.

Nếu đó là DB của tôi, có lẽ tôi sẽ chọn chỉ số duy nhất, tất cả những thứ khác đều bằng nhau.


Cảm ơn - bạn có bất kỳ liên kết tham khảo? tồi tệ hơn một chút, bạn chỉ đề cập đến mật độ chỉ số thấp hơn trong chỉ số bao phủ, hoặc có điều gì khác sẽ gây ra điều này?
StuartLC

Thật không may, từ rất nhiều kinh nghiệm không may, và trò chuyện với những người thông minh hơn tôi nhiều năm qua! Và vâng, chính xác là như vậy - sẽ có ít hàng hơn trên mỗi trang, vì vậy nhiều I / O hơn. Tuy nhiên - điều đáng chú ý là các cột INCLUDE chỉ xuất hiện ở cấp độ lá. Vì vậy, nó không phải là tất cả xấu. Tôi chắc rằng bạn biết rằng dựa trên chi tiết trong câu hỏi của bạn, nhưng tôi đoán những người đọc khác có thể không.
Matt Whitfield

-2

Theo như tôi biết, không thể thêm các cột che vào Khóa chính

Nếu bạn có một chỉ mục được nhóm trên KeyColumn, thì vì đó là một chỉ mục được nhóm, tất cả các cột khác đều được 'bao phủ'. Vì vậy, bạn không đạt được bất cứ điều gì bằng cách thêm một chỉ mục khác trên KeyColumn. Trong thực tế, bạn sẽ làm chậm phần chèn của mình và sử dụng nhiều dung lượng hơn.

Điều này là do một chỉ mục được nhóm không phải là một chỉ mục như vậy, mà chỉ là một hướng dẫn để lưu trữ các hàng của bảng theo thứ tự của chỉ mục. Và một khi bạn đã mở một hàng bằng khóa chính, thì bạn có tất cả các cột khác ngay tại đó.


2
Từ đoạn đầu tiên:The table is clustered by another column entirely.
JNK

5
Tôi nghĩ rằng có thể có một số nhầm lẫn chính / cụm chỉ số chính đang diễn ra ở đây. Mặc dù các nỗ lực tốt nhất của studio quản lý để thuyết phục bạn như vậy, nhưng chúng không giống nhau.
Matt Whitfield
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.