2009-05-07 32 views
316

MS SQL Server 2000Khóa ngoại có tự động tạo chỉ mục không?

Tôi cảm thấy ngớ ngẩn khi đặt câu hỏi này, nhưng tôi đã được thông báo rằng nếu tôi có hai bàn phím ngoài, SQL Server sẽ tạo một thứ gì đó giống như chỉ mục trong bảng con. Tôi có một thời gian khó tin rằng điều này là đúng, nhưng không thể tìm thấy nhiều ra có liên quan cụ thể đến điều này.

Lý do thực sự của tôi khi yêu cầu điều này là bởi vì chúng tôi đang gặp một số thời gian phản hồi rất chậm trong tuyên bố xóa đối với bảng có thể có 15 bảng có liên quan. Tôi đã hỏi anh chàng cơ sở dữ liệu của chúng tôi và anh ấy nói rằng nếu có một khóa ngoại trên các lĩnh vực, sau đó nó hoạt động như một chỉ mục. Kinh nghiệm của bạn với điều này là gì? Tôi có nên thêm các chỉ mục trên tất cả các trường khóa ngoài hay chúng chỉ là chi phí không cần thiết?

+41

không ngớ ngẩn khi hỏi điều này! –

+0

Sau khi nhìn thấy một số câu trả lời, tôi đoán bạn đã đúng. Có một chút nhầm lẫn về điều này. Cảm ơn tất cả! –

+4

Nếu bạn đang nhận được xóa chậm và bảng bạn đang xóa từ tham chiếu bởi các bảng khác, bạn có thể sẽ nhận được một tăng hiệu suất bằng cách lập chỉ mục các khóa nước ngoài trong các bảng * khác *. Điều này là do khi SQL xóa một hàng, nó cần kiểm tra tính toàn vẹn tham chiếu trên hàng. Để làm điều này, rõ ràng là cần phải kiểm tra xem không có hàng nào khác tồn tại tham chiếu đến hàng bạn đang xóa. –

Trả lời

271

Khóa ngoại là một ràng buộc, một mối quan hệ giữa hai bảng - không có gì liên quan đến chỉ mục. Nhưng nó là một thực tế được biết rằng nó làm cho rất nhiều ý nghĩa để lập chỉ mục tất cả các cột là một phần của bất kỳ mối quan hệ khóa nước ngoài, bởi vì thông qua một mối quan hệ FK, bạn sẽ thường cần tra cứu một bảng liên quan và trích xuất các hàng nhất định dựa trên một giá trị đơn lẻ hoặc một dải giá trị.

Vì vậy, có ý nghĩa tốt khi lập chỉ mục bất kỳ cột nào có liên quan đến FK, nhưng FK mỗi lần không phải là chỉ mục.

Xem bài viết tuyệt vời của Kimberly Tripp "When did SQL Server stop putting indexes on Foreign Key columns?".

+0

Đúng vậy. Tôi chỉ là về tích cực mà PostgreSQL tạo ra một chỉ mục. Tôi khá chắc chắn rằng MySQL có. Làm cho chỉ mục tạo ra một tấn ý nghĩa, nhưng nó KHÔNG YÊU CẦU. Sau khi tất cả, tại sao tham khảo một cái gì đó nếu mỗi khi DB đi để tìm nó lên nó phải làm một tablescan? – MBCook

+0

Bài viết này được đề cập ở trên là loại khó hiểu vì máy chủ SQL hoặc bất kỳ cơ sở dữ liệu nào khác không bao giờ đặt chỉ mục trên FK. – vsingh

+6

@vsingh: đó là chính xác những gì bài viết cố gắng truyền tải - đó là một quan niệm sai lầm phổ biến ** ** rằng một FK tự động tạo ra một chỉ mục - nó không ** không ** làm điều đó. –

3

Không phải với kiến ​​thức của tôi. Khóa ngoại chỉ thêm một ràng buộc mà giá trị trong khóa con cũng được biểu diễn ở đâu đó trong cột cha. Nó không nói với cơ sở dữ liệu rằng khóa con cũng cần phải được lập chỉ mục, chỉ bị ràng buộc.

15

Không, không có chỉ mục tiềm ẩn về các trường khóa ngoài, nếu không thì tại sao Microsoft lại nói "Creating an index on a foreign key is often useful". Đồng nghiệp của bạn có thể nhầm lẫn trường khóa ngoài trong bảng giới thiệu với khóa chính trong bảng được tham chiếu - các khóa chính làm tạo chỉ mục ẩn.

+0

những gì "Chỉ mục tiềm ẩn" là gì? nó chỉ ngụ ý rằng có một cây b * mà không tạo ra nó? –

+1

@Stephanie Page: Đó là một biểu thức tôi vừa tạo cho câu trả lời này có nghĩa là một chỉ mục được tạo tự động. Nếu bạn khai báo một khóa chính, SQL server sẽ tự động tạo và lập chỉ mục cho nó. Nhưng không ff bạn khai báo một khóa ngoại (một số hệ thống DB khác làm). –

4

SQL Server tự động tạo chỉ mục cho Khóa chính, nhưng không cho Khóa ngoại. Tạo chỉ mục cho Khóa ngoại. Nó có lẽ đáng giá.

33

Chà, câu trả lời là tất cả trên bản đồ. Vì vậy, các Documentation nói:

Một ràng buộc khoá ngoại là một ứng cử viên cho một chỉ số vì:

  • Thay đổi chế PRIMARY KEY được kiểm tra với các ràng buộc khóa ngoại trong bảng liên quan.

  • Cột khóa ngoài thường được sử dụng trong tiêu chí kết hợp khi dữ liệu từ các bảng có liên quan được kết hợp trong truy vấn bằng cách khớp các cột trong ràng buộc KEY NGOẠI HỐI của một bảng với cột khóa chính hoặc duy nhất trong cái bàn kia. Một chỉ mục cho phép Microsoft® SQL Server ™ 2000 tìm các dữ liệu liên quan trong bảng khóa ngoài nhanh chóng. Tuy nhiên, việc tạo chỉ mục này không phải là một yêu cầu. Dữ liệu từ hai bảng có liên quan có thể được kết hợp ngay cả khi không có ràng buộc PRIMARY KEY hoặc NGOẠI NGOẠI được định nghĩa giữa các bảng, nhưng mối quan hệ khóa ngoài giữa hai bảng chỉ ra rằng hai bảng đã được tối ưu hóa để kết hợp trong truy vấn sử dụng các phím tiêu chí của nó.

Vì vậy, có vẻ như rất rõ ràng (mặc dù tài liệu có chút lộn xộn) nhưng thực tế không tạo ra chỉ mục.

+3

Chính xác - đó là * CANDIDATE * cho chỉ mục - nhưng nó không tự động được tạo thành chỉ mục! Khá rõ ràng thực sự, IMHO :-) –

+4

Tôi thấy phần này bị lộn xộn: "mối quan hệ khóa ngoài giữa hai bảng cho thấy rằng hai bảng đã được tối ưu hóa để được kết hợp trong truy vấn sử dụng các khóa làm tiêu chí của nó." Điều đó nên đọc "... hai bảng nên được tối ưu hóa ..." – Yishai

2

Nói đúng ra, khóa ngoại không có gì liên quan đến chỉ mục, vâng. Nhưng, như những người nói trên tôi đã chỉ ra, nó có ý nghĩa để tạo ra một để tăng tốc độ tra cứu FK. Trong thực tế, trong MySQL, nếu bạn không chỉ định một chỉ mục trong khai báo FK của bạn, công cụ (InnoDB) tạo ra nó cho bạn một cách tự động.

6

Giả sử bạn có một bảng lớn được gọi là đơn đặt hàng và một bảng nhỏ gọi là khách hàng. Có một khóa ngoại từ một đơn đặt hàng cho một khách hàng. Bây giờ nếu bạn xóa một khách hàng, Sql Server phải kiểm tra rằng không có lệnh mồ côi; nếu có, nó sẽ gây ra lỗi.

Để kiểm tra xem có bất kỳ đơn hàng nào không, Sql Server phải tìm kiếm bảng đơn đặt hàng lớn. Bây giờ nếu có chỉ mục, tìm kiếm sẽ nhanh; nếu không, tìm kiếm sẽ chậm.

Vì vậy, trong trường hợp này, việc xóa chậm có thể được giải thích do thiếu chỉ mục. Đặc biệt nếu Sql Server sẽ phải tìm kiếm 15 bảng lớn mà không có chỉ mục.

P.S. Nếu khóa ngoại đã ON DELETE CASCADE, Sql Server vẫn phải tìm kiếm bảng thứ tự, nhưng sau đó loại bỏ bất kỳ đơn đặt hàng nào tham chiếu đến khách hàng đã xóa.

+0

Chính xác - đó là lý do một chỉ mục trên FK thực hiện rất nhiều ý nghĩa (hầu hết thời gian) –

+0

Hầu hết thời gian? Dường như đây là trường hợp xóa từ cha mẹ. Nếu hầu hết thời gian bạn xóa khỏi cha mẹ, tôi đoán đó là sự thật. –

1

Trong PostgeSql bạn có thể kiểm tra các chỉ số chính mình nếu bạn nhấn \ d tablename

Bạn sẽ thấy rằng chỉ số btree đã được tự động tạo ra trên cột với khóa chính và ràng buộc duy nhất, nhưng không phải trên các cột với các phím nước ngoài.

Tôi nghĩ rằng câu trả lời cho câu hỏi của bạn ít nhất là cho bưu điện.

+0

Xin lỗi, tôi đã không nhận thấy rằng câu hỏi liên quan đến MS SQL Server nhưng sau khi đã đăng câu trả lời. Nó có lẽ vẫn có thể giúp ai đó ... – Gregor

3

Khóa ngoại không tạo chỉ mục. Chỉ có các ràng buộc khoá thay thế (UNIQUE) và các ràng buộc khóa chính tạo ra các chỉ mục. Điều này đúng trong Oracle và SQL Server.

1

Tôi nhận thấy rằng Khuôn khổ thực thể 6.1 chỉ vào MSSQL tự động thêm chỉ mục trên các khóa ngoại.

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