2008-11-10 32 views

Trả lời

59

SQL Server sẽ không tự động tạo một chỉ mục trên một chìa khóa nước ngoài. Cũng từ MSDN:

Một ràng buộc khoá ngoại không có được liên kết chỉ đến một PRIMARY KEY hạn chế trong bảng khác; nó có thể cũng được xác định để tham chiếu các cột của một hạn chế UNIQUE trong một bảng khác. Một NGOẠI HỐI KEY ràng buộc có thể chứa giá trị null; Tuy nhiên, , nếu bất kỳ cột nào của một composite Ràng buộc KEY NGOẠI HỐI có chứa giá trị rỗng, xác minh tất cả các giá trị tạo nên ràng buộc NGOẠI HỐI bị bỏ qua. Để đảm bảo rằng tất cả các giá trị của tổng hợp FOREIGN Ràng buộc KEY được xác minh, hãy chỉ định NOT NULL trên tất cả các cột tham gia .

+0

Tất cả các bằng chứng dường như không trỏ đến chỉ mục tự động trên Table1Column. Đã tạo chỉ mục bình thường mà không cần SQL Server phàn nàn. –

+0

Văn bản được trích dẫn để làm gì với câu hỏi hoặc câu lệnh đó không được tạo tự động? – John

23

Khi tôi đọc câu hỏi của Mike, Anh ấy hỏi liệu Ràng buộc FK có tạo chỉ mục trên cột FK trong Bảng FK không (Bảng 1). Câu trả lời là không, và nói chung. (vì mục đích của ràng buộc), không cần phải làm điều này (Các) cột được định nghĩa là "TARGET" của ràng buộc, mặt khác, phải là một chỉ mục duy nhất trong bảng được tham chiếu, hoặc là khóa chính hoặc một phím thay thế. (chỉ mục duy nhất) hoặc stat Constraint Tạo sẽ thất bại.

(EDIT: Đã thêm để đối phó rõ ràng với nhận xét bên dưới) - Cụ thể, khi cung cấp tính nhất quán dữ liệu có ràng buộc khóa ngoại. một chỉ mục có thể ảnh hưởng đến hiệu suất của một Ràng buộc DRI chỉ cho việc xóa một Hàng hoặc các hàng ở phía FK. Khi sử dụng ràng buộc, trong khi chèn hoặc cập nhật bộ xử lý biết giá trị FK, và phải kiểm tra sự tồn tại của một hàng trong bảng được tham chiếu ở phía PK. Đã có một chỉ mục ở đó. Khi xóa một hàng ở phía PK, nó phải xác minh rằng không có hàng nào ở phía FK. Một chỉ mục có thể hữu ích một chút trong trường hợp này. Nhưng đây không phải là một kịch bản phổ biến.

Ngoài ra, trong một số loại truy vấn nhất định, tuy nhiên, nơi bộ xử lý truy vấn cần tìm các bản ghi ở nhiều phía của một kết nối sử dụng cột khóa ngoài đó. tham gia hiệu suất tăng khi có chỉ mục tồn tại trên khóa ngoại đó. Nhưng điều kiện này là đặc biệt đối với việc sử dụng cột FK trong truy vấn kết nối, không phải với sự tồn tại của ràng buộc khóa ngoài ... Nó không quan trọng liệu phía bên kia của kết nối là PK hay chỉ một số cột tùy ý khác. Ngoài ra, nếu bạn cần lọc, hoặc sắp xếp các kết quả của một truy vấn dựa trên cột FK đó, một chỉ mục sẽ giúp ... Một lần nữa, điều này không liên quan gì đến ràng buộc khóa ngoài trên cột đó.

+8

"và nói chung không cần phải làm điều này ..." - tuyên bố đó là không chính xác tôi sợ. Lập chỉ mục FK có thể dẫn đến hiệu suất tốt hơn trong nhiều tình huống. –

+0

@Mike, Thực tế là bạn có thể muốn sử dụng cùng một cột trong một phép nối, (nơi một chỉ mục có thể trợ giúp) không có nghĩa là một chỉ mục được yêu cầu cho ràng buộc. Bạn cũng có thể muốn sử dụng chỉ mục trong một vị từ mệnh đề where, nơi một chỉ mục cũng có thể trợ giúp. Điều này có nghĩa là chỉ số được yêu cầu chỉ cho phía FK của Ràng buộc DRI không? Không, một FK trên một ràng buộc "nói chung" (ngoại trừ xóa ở phía PK) không có lợi ích từ một chỉ mục. Sử dụng colour FK trong một gia nhập (tình huống khác) hoặc, cho rằng vấn đề, trong một mệnh đề Where, là những gì garners hưởng lợi từ chỉ mục. –

+1

Nếu không có chỉ mục trên khóa ngoại thì việc xóa các hàng trên bảng được tham chiếu sẽ khiến bảng quét trên bàn bằng khóa ngoài. http://sqlperformance.com/2012/11/t-sql-queries/benefits-indexing-foreign-keys –

4

Không, việc tạo khóa ngoài trên cột không tự động tạo chỉ mục trên cột đó.

Không lập chỉ mục cột khóa ngoài sẽ làm cho bảng đó được quét mỗi khi một bản ghi bị xóa khỏi bảng được tham chiếu (phụ huynh).

Trong sơ đồ ví dụ này:

CREATE TABLE MasterOrder (
    MasterOrderID INT PRIMARY KEY) 

CREATE TABLE OrderDetail(
    OrderDetailID INT, 
    MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID) 
) 

OrderDetail sẽ được quét mỗi lần một kỷ lục này sẽ bị xóa trong bảng MasterOrder.

Bởi vì các chỉ mục tác động chèn, cập nhật và xóa, bạn có thể không phải luôn luôn phải chịu các khóa ngoại trên cao nếu bản ghi bảng gốc không bao giờ bị xóa.

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