11

Tôi có một tình huống như thế này:Ràng buộc khoá ngoại có ảnh hưởng đến các biến đổi truy vấn trong Oracle không?

create table a(
    a_id number(38) not null, 
    constraint pk_a primary key (id) 
); 

create table b(
    a_id number(38) not null 
); 

create index b_a_id_index on b(a_id); 

Bây giờ b.a_id được trong thực tế có nghĩa là một chìa khóa nước ngoài tham khảo a.a_id, nhưng nó không được chính thức tuyên bố như vậy. Rõ ràng, nó phải là vì lý do toàn vẹn. Nhưng một ràng buộc khóa ngoại cũng cải thiện hiệu suất tham gia nói chung hay trong các trường hợp cụ thể? Nếu có, cho loại chuyển đổi truy vấn nào?

Có bất kỳ tài liệu liên quan nào về chủ đề này không?

Tôi đang sử dụng Oracle 11g (11.2.0.2.0)

Trả lời

13

Có, có các ràng buộc khóa ngoài tại chỗ có thể cải thiện hiệu suất truy vấn. Có các biến đổi khác nhau được mở cho trình tối ưu hóa khi tồn tại các ràng buộc khóa ngoài thích hợp mà thường không có sẵn. Ví dụ: nếu bạn tham gia AB nhưng chỉ chọn dữ liệu từ B, trình tối ưu hóa có thể loại bỏ hoàn toàn A khỏi kế hoạch truy vấn nếu có ràng buộc khóa ngoài tại chỗ (loại điều này rất tiện dụng khi bạn có lượt xem hữu ích tham gia vào nhiều bảng hơn truy vấn hiện tại của bạn theo đúng nhu cầu bởi vì bạn không phải giao dịch chi phí hiệu suất của các lần gia nhập bổ sung đối với việc sử dụng lại mã từ việc sử dụng chế độ xem hiện tại). Chúng cũng có ích khi bạn đang làm những việc như sử dụng những thứ như truy vấn viết lại để viết lại một truy vấn để sử dụng khung nhìn vật chất hóa trong hệ thống kiểu kho dữ liệu/DSS dữ liệu.

Tom Kyte có bài thuyết trình Metadata Matters nói về các loại ràng buộc khác nhau, cùng với các phần siêu dữ liệu khác, có thể ảnh hưởng đến trình tối ưu hóa.

+0

Tôi chắc chắn tôi đã đọc một cái gì đó như thế này trước đây. Nó có vẻ hiển nhiên anyway. Cảm ơn câu trả lời và liên kết tuyệt vời! –

+1

Liên kết bị hỏng, tôi đoán bản trình bày là: http://docslide.us/documents/metadata-matters-by-tom-kyte-oracle.html – gaps96

1

Khi Justin đã được chỉ ra, JOIN loại bỏ là một sự chuyển đổi SQL không dựa trên chi phí không cần thiết, có thể được áp dụng dựa trên sự hiện diện của dữ liệu meta. Tôi đã viết blog về vấn đề này gần đây:

Như tôi ban đầu cho rằng, có rất nhiều biến đổi SQL mà phụ thuộc vào dữ liệu meta, vì vậy thêm ràng buộc khoá ngoại (và các ràng buộc khác) chắc chắn có thể tác động đến hiệu suất một cách tích cực.

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