2009-01-20 35 views
83

Giả sử tôi có hàng ID (int) trong bộ cơ sở dữ liệu làm khóa chính. Nếu tôi truy vấn ID thường thì tôi cũng cần lập chỉ mục nó? Hay nó là một khóa chính có nghĩa là nó đã được lập chỉ mục?khóa chính và chỉ mục sql

Lý do tôi hỏi là vì trong MS SQL Server tôi có thể tạo chỉ mục trên ID này, như tôi đã nêu là khóa chính của tôi.

Chỉnh sửa: một câu hỏi bổ sung - liệu có gây hại gì cho việc thêm chỉ mục khóa chính không?

Trả lời

58

Bạn nói đúng, thật khó hiểu khi SQL Server cho phép bạn tạo các chỉ mục trùng lặp trên cùng một trường. Nhưng thực tế là bạn có thể tạo một cái khác không chỉ ra rằng chỉ mục PK cũng không tồn tại.

Chỉ mục bổ sung không tốt, nhưng tác hại duy nhất (rất nhỏ) là kích thước tệp bổ sung và chi phí tạo hàng bổ sung.

+27

Thiệt hại của các chỉ mục không sử dụng thực sự rất có hại. Đối với một điều, chỉ số ăn lên lưu trữ. Đối với một điều khác, nó làm chậm ghi và cập nhật. Luôn xóa các chỉ mục sẽ không được sử dụng. – Pacerier

0

khóa chính sẽ tự động được lập chỉ mục

bạn có thể tạo các chỉ số bổ sung sử dụng các vn tùy thuộc vào cách sử dụng của bạn

  • index ZIP_CODE, id có thể hữu ích nếu bạn thường xuyên chọn bởi ZIP_CODE và id
16

Các khóa chính luôn được lập chỉ mục theo mặc định.

Bạn có thể xác định khóa chính trong SQL Server 2012 bằng cách sử dụng SQL Server Management Studio hoặc Transact-SQL. Tạo khóa chính sẽ tự động tạo một chỉ mục duy nhất, nhóm hoặc không được chỉ định tương ứng.

http://technet.microsoft.com/en-us/library/ms189039.aspx

0

Tôi có một cơ sở dữ liệu khổng lồ với không có chỉ mục (riêng biệt).

Bất kỳ lúc nào tôi truy vấn bằng khóa chính, kết quả là, cho tất cả các mục đích chuyên sâu, ngay lập tức.

+0

Đó là vì PK là một chỉ số nhóm, xem xét kế hoạch truy vấn của bạn – SQLMenace

+1

Tôi sẽ xem xét kế hoạch truy vấn nếu có sự cố. – Grant

7

PK sẽ trở thành chỉ mục được nhóm trừ khi bạn chỉ định không được nhóm

2

Làm cho khóa chính cũng sẽ tự động tạo chỉ mục cho nó.

7

Đây là đoạn từ MSDN:

Khi bạn chỉ định một hạn chế PRIMARY KEY cho một bảng, Engine Cơ sở dữ liệu thực thi dữ liệu độc đáo bằng cách tạo ra một chỉ số duy nhất cho các cột khóa chính. Chỉ mục này cũng cho phép truy cập nhanh vào dữ liệu khi khóa chính được sử dụng trong các truy vấn. Do đó, các khóa chính được chọn phải tuân thủ các quy tắc để tạo các chỉ mục duy nhất.

41

Như mọi người khác đã nói, các khóa chính sẽ được lập chỉ mục tự động.

Tạo thêm chỉ mục trên cột khóa chính chỉ có ý nghĩa khi bạn cần tối ưu hóa truy vấn sử dụng khóa chính và một số cột cụ thể khác. Bằng cách tạo một chỉ mục khác trên cột khóa chính và bao gồm một số cột khác với nó, bạn có thể đạt được tối ưu hóa mong muốn cho một truy vấn.

Ví dụ bạn có bảng có nhiều cột nhưng bạn chỉ đang truy vấn cột ID, Tên và Địa chỉ. Lấy ID làm khóa chính, chúng ta có thể tạo chỉ mục sau được xây dựng trên ID nhưng bao gồm các cột Tên và Địa chỉ.

CREATE NONCLUSTERED INDEX MyIndex 
ON MyTable(ID) 
INCLUDE (Name, Address) 

Vì vậy, khi bạn sử dụng truy vấn này:

SELECT ID, Name, Address FROM MyTable WHERE ID > 1000 

SQL Server sẽ cung cấp cho bạn kết quả chỉ sử dụng các chỉ số bạn đã tạo ra và nó sẽ không đọc bất cứ điều gì từ bảng thực tế.

24

LƯU Ý: Câu trả lời này đề cập đến phát triển cấp doanh nghiệp trong lớn.

Đây là vấn đề RDBMS, không chỉ SQL Server và hành vi có thể rất thú vị. Đối với một, trong khi nó là phổ biến cho các khóa chính được tự động (duy nhất) lập chỉ mục, nó là không tuyệt đối. Có những lúc điều quan trọng là khóa chính KHÔNG được lập chỉ mục duy nhất.

Trong hầu hết các RDBMS, chỉ mục duy nhất sẽ tự động được tạo trên khóa chính nếu chưa tồn tại. Do đó, bạn có thể tạo chỉ mục của riêng bạn trên cột khóa chính trước khi khai báo nó làm khóa chính, sau đó chỉ mục đó sẽ được sử dụng (nếu được chấp nhận) bởi công cụ cơ sở dữ liệu khi bạn áp dụng khai báo khóa chính. Thông thường, bạn có thể tạo khóa chính và cho phép chỉ mục duy nhất mặc định của nó được tạo, sau đó tạo chỉ mục thay thế của riêng bạn trên cột đó, sau đó thả chỉ mục mặc định.

Bây giờ cho phần thú vị - khi nào bạn KHÔNG muốn một chỉ mục khóa chính duy nhất? Bạn không muốn một, và không thể chịu đựng được một, khi bảng của bạn mua lại đủ dữ liệu (hàng) để làm cho việc duy trì chỉ mục quá đắt. Điều này thay đổi dựa trên phần cứng, công cụ RDBMS, đặc điểm của bảng và cơ sở dữ liệu và tải hệ thống. Tuy nhiên, nó thường bắt đầu biểu hiện khi một bảng đạt đến vài triệu hàng.

Vấn đề quan trọng là mỗi lần chèn một hàng hoặc cập nhật của cột khóa chính dẫn đến quét chỉ mục để đảm bảo tính duy nhất. Việc quét chỉ mục duy nhất đó (hoặc giá trị tương đương của nó trong bất kỳ RDBMS) nào trở nên đắt hơn nhiều khi bảng phát triển, cho đến khi nó thống trị hiệu suất của bảng.

Tôi đã xử lý vấn đề này nhiều lần với các bảng lớn tới hai tỷ hàng, 8 TB bộ nhớ và 40 triệu hàng chèn mỗi ngày. Tôi đã được giao nhiệm vụ thiết kế lại hệ thống liên quan, bao gồm việc giảm chỉ mục khóa chính duy nhất thực tế như bước một. Thật vậy, việc giảm chỉ số đó là cần thiết trong sản xuất chỉ đơn giản là để phục hồi từ một cúp, trước khi chúng tôi thậm chí đã gần với một thiết kế lại. Việc thiết kế lại đó bao gồm việc tìm kiếm các cách khác để đảm bảo tính duy nhất của khóa chính và cung cấp truy cập nhanh vào dữ liệu.

+1

Chà. Thú vị bình luận/công việc. – Ryan

+0

(mind == blown) – quillbreaker

+0

Điều gì sẽ xảy ra nếu khóa là khóa tự động int hoặc bigint? SQL Server có đủ thông minh để không thực hiện quét chỉ mục duy nhất trong trường hợp này không? – quillbreaker

1

Cũng trong SQL Server, nói chung, khóa chính được lập chỉ mục tự động. Điều này đúng, nhưng không đảm bảo truy vấn nhanh hơn. Khóa chính sẽ cung cấp cho bạn hiệu suất tuyệt vời khi chỉ có 1 trường làm khóa chính. Nhưng, khi có nhiều trường làm khóa chính, thì chỉ mục được dựa trên các trường đó.

Ví dụ: Trường A, B, C là khóa chính, do đó khi bạn thực hiện truy vấn dựa trên 3 trường trong WHERE CLAUSE của bạn, hiệu suất là tốt, NHƯNG khi bạn muốn truy vấn với trường C chỉ trong WHERE CLAUSE, bạn sẽ không nhận được hiệu suất tốt. Vì vậy, để có được hiệu suất của bạn và chạy, bạn sẽ cần phải lập chỉ mục trường C theo cách thủ công.

Hầu hết thời gian, bạn sẽ không thấy vấn đề cho đến khi bạn truy cập hơn 1 triệu bản ghi.

Các vấn đề liên quan