Tôi có cần tạo chỉ mục trên khóa ngoại trên Oracle không?


121

Tôi có một cái bàn Avà một cái bàn B. Acó chính nước ngoài để Bvào Bkhóa chính 's, B_ID.

Vì một số lý do (tôi biết là có những lý do chính đáng) nó không sử dụng chỉ mục khi tôi nối hai bảng này trên khóa.

Tôi có cần phải tạo riêng một chỉ mục trên A.B_IDhay sự tồn tại của khóa ngoại cung cấp điều đó không?

Câu trả lời:


138

Riêng ràng buộc khóa ngoại không cung cấp chỉ mục trên Oracle - một chỉ mục phải (và nên) được tạo.


11
Trên một số cơ sở dữ liệu tạo ra một ràng buộc khoá ngoại cũng tạo ra một chỉ số ... tức là Jet Engine (file MSAccess, Firebird và MySQL)
bubi

17
Câu trả lời này là vô nghĩa nếu không đề cập rõ ràng đến một triển khai cơ sở dữ liệu cụ thể. Chắc chắn câu hỏi được gắn thẻ oraclenhưng điều đó không rõ ràng ngay lập tức khi bạn đến đây từ tìm kiếm trên google.
developerbmw

5
Tôi có thể xác nhận rằng PostgreSQL - ít nhất là tại thời điểm bài đăng này - không tự động làm điều đó.
The Dembinski

Câu trả lời tương tự cho SQL Server (2016, Azure ...), theo như tôi biết.
Pac0

Tại sao người ta phải tạo chỉ mục trên khóa ngoại với Oracle? Làm ơn để lại hậu quả của việc không làm như vậy là gì?
Đỗ Công Bằng

46

Việc tạo khóa ngoại không tự động tạo chỉ mục trên A.B_ID. Vì vậy, nhìn chung sẽ có ý nghĩa từ quan điểm hiệu suất truy vấn nếu tạo một chỉ mục riêng trên A.B_ID.

Nếu bạn từng xóa các hàng trong B, bạn chắc chắn muốn A.B_ID được lập chỉ mục. Nếu không, Oracle sẽ phải quét toàn bộ bảng trên A mỗi khi bạn xóa một hàng khỏi B để đảm bảo rằng không có bản ghi nào bị mất tích (tùy thuộc vào phiên bản Oracle, có thể có thêm các hàm ý khóa, nhưng chúng được giảm bớt. trong các phiên bản Oracle gần đây hơn).


1
Điều gì về cột PFK? ví dụ: nếu tôi có một bảng trung gian cho mối quan hệ nhiều-nhiều, tôi có thể tạo chỉ mục cho hai cột PFK của bảng này không?
Clamari

3
@Clamari - Nếu C có khóa chính là (A_ID, B_ID), thì khóa chính sẽ đảm nhiệm việc có thể xóa khỏi A. Nếu bạn cũng muốn có thể xóa khỏi B một cách hiệu quả, bạn sẽ muốn bật chỉ mục B_ID.
Justin Cave

25

Chỉ để biết thêm thông tin: Oracle không tự động tạo chỉ mục (như cách làm đối với các ràng buộc duy nhất) bởi vì (a) không bắt buộc phải thực thi ràng buộc và (b) trong một số trường hợp bạn không cần.

Tuy nhiên, hầu hết thời gian, bạn sẽ muốn tạo một chỉ mục (trên thực tế, trong Oracle Apex có một báo cáo về "khóa ngoại không được lập chỉ mục").

Bất cứ khi nào ứng dụng cần có khả năng xóa một hàng trong bảng mẹ hoặc cập nhật giá trị PK (hiếm hơn), DML sẽ bị ảnh hưởng nếu không có chỉ mục nào tồn tại, vì nó sẽ phải khóa toàn bộ bảng con.

Một trường hợp mà tôi thường chọn không thêm chỉ mục là FK nằm trong bảng "dữ liệu tĩnh" xác định miền của cột (ví dụ: bảng mã trạng thái), nơi không bao giờ thực hiện cập nhật và xóa trên bảng mẹ. trực tiếp bằng ứng dụng. Tuy nhiên, nếu việc thêm một chỉ mục trên cột mang lại lợi ích cho các truy vấn quan trọng trong ứng dụng, thì chỉ mục vẫn sẽ là một ý tưởng hay.


14

SQL Server chưa bao giờ tự động đặt các chỉ mục vào các cột khóa ngoại - hãy xem bài đăng trên blog xuất sắc của Kim Tripp về bối cảnh và lịch sử của huyền thoại đô thị này.

Tuy nhiên, bạn nên lập chỉ mục các cột khóa ngoại của mình - vì vậy có, tôi khuyên bạn nên đảm bảo mỗi cột FK được sao lưu bởi một chỉ mục; không nhất thiết chỉ trên một cột đó - có thể có ý nghĩa khi tạo một chỉ mục trên hai hoặc ba cột với cột FK là cột đầu tiên trong đó. Phụ thuộc vào kịch bản và dữ liệu của bạn.


8

Vì lý do hiệu suất, một chỉ mục nên được tạo. Được sử dụng trong các thao tác xóa trên bảng chính (để kiểm tra xem bản ghi bạn đang xóa không được sử dụng) và trong các phép nối mà thường có khóa ngoại. Chỉ có một số bảng (tôi không tạo chúng trong nhật ký) có thể không cần chỉ mục nhưng có lẽ, trong trường hợp này có lẽ bạn cũng không cần ràng buộc khóa ngoại.

NHƯNG

Có một số cơ sở dữ liệu đã tự động tạo chỉ mục trên các Khóa ngoại. Jet Engine (Microsoft Access Files) Firebird MySQL

CHẮC CHẮN

SQL Server Oracle

KHÔNG LÀM


3
Thx đã đề cập rằng FIrebird SQL thực hiện nó tự động. Đó chính xác là điểm tôi đang tìm kiếm.
user424855

1

Như với bất cứ điều gì liên quan đến hiệu suất, nó phụ thuộc vào nhiều yếu tố và không có viên đạn nào giống như trong một môi trường hoạt động rất cao, việc duy trì một chỉ số có thể không được chấp nhận.

Điểm nổi bật nhất ở đây dường như là tính chọn lọc: nếu các giá trị trong chỉ mục bị trùng lặp nhiều thì việc giảm chỉ mục (nếu có thể) và cho phép quét bảng có thể mang lại hiệu suất tốt hơn.


1

Các ràng buộc UNIQUE, PRIMARY KEY và FOREIGN KEY tạo ra các chỉ mục thực thi hoặc "quay lại" ràng buộc (và đôi khi được gọi là chỉ mục hỗ trợ). Các ràng buộc CHÍNH CHÍNH tạo ra các chỉ mục duy nhất. Ràng buộc NGOẠI KHÓA tạo ra các chỉ mục không phải là duy nhất. Các ràng buộc UNIQUE tạo ra các chỉ mục duy nhất nếu tất cả các cột đều không thể nullable và chúng tạo ra các chỉ mục không phải là duy nhất nếu một hoặc nhiều cột có thể null. Do đó, nếu một cột hoặc tập hợp các cột có ràng buộc DUY NHẤT, TỪ KHÓA CHÍNH hoặc TỪ KHÓA NGOẠI LỆ trên đó, bạn không cần tạo chỉ mục trên các cột đó để thực hiện.



Các tài liệu bạn đã liên kết là dành cho Derby, cơ sở dữ liệu Java nhúng, không dành cho Oracle.
Davos
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.