2012-06-14 18 views
7

Có bất kỳ ý nghĩa nào theo thứ tự bảng trong câu lệnh nối sql hay không. Ví dụCó bất kỳ ý nghĩa nào theo thứ tự bảng trong câu lệnh nối sql hay không

SELECT dept_name, emp_name 
FROM Employee 
INNER JOIN Department ON Employee.dept_id = Department.dept_id 

SELECT dept_name, emp_name 
FROM Department 
INNER JOIN Employee ON Employee.dept_id = Department.dept_id 

Có là bất kỳ lợi thế hiệu suất theo thứ tự của bảng?

Trả lời

9

Không có.

Hầu hết (nếu không phải tất cả) DBMS sử dụng trình tối ưu hóa dựa trên chi phí. Thứ tự mà bạn chỉ định báo cáo của bạn không ảnh hưởng đến tốc độ thực thi.

Oracle SQL cost based optimization

ưu SQL dựa trên chi phí của Oracle (CBO) là một thành phần cực kỳ phức tạp của Oracle mà điều chỉnh việc thực hiện cho mỗi truy vấn Oracle. CBO đã phát triển thành một trong những thành phần phần mềm phức tạp nhất thế giới , và nó có công việc khó khăn khi đánh giá bất kỳ câu lệnh SQL nào và tạo ra kế hoạch thực hiện "tốt nhất" cho câu lệnh .

Cả hai báo cáo của bạn sẽ tạo ra cùng kế hoạch thực hiện và do đó có những đặc điểm Biến tương tự. Lưu ý rằng chi phí sẽ dựa trên số liệu thống kê có sẵn. Số liệu thống kê được cập nhật là rất quan trọng đối với trình tối ưu hóa để có thể tạo ra kế hoạch thực hiện hiệu quả nhất.

+1

+1. Tôi sẽ thêm (chỉ để nitpick) rằng hai báo cáo nên tạo ra cùng một kế hoạch thực hiện, * mọi thứ khác bằng nhau * (tức là phân tích cú pháp tại cùng một thời điểm, với cùng một số liệu thống kê bảng, vv). Có những trường hợp (ngoài phạm vi của câu hỏi này), trong đó hai truy vấn có thể xuất hiện để đưa ra các kế hoạch khác nhau. –

0

No. Trình tối ưu hóa chỉ ra con đường kết nối tốt nhất hoặc ít nhất nó nghĩ là đường nối tốt nhất. Trong những tình huống bất thường, đôi khi nó không có tất cả thông tin cần thiết, nhưng 99% thời gian nó sẽ làm cho nó đúng. Nó sẽ viết lại nội bộ câu lệnh SQL theo các cách khác.

1

Trình tối ưu hóa sẽ kiểm tra tất cả các hoán vị thứ tự có thể có và thực hiện phép hoán vị có giá trị chi phí thấp nhất. Điều đó có nghĩa là tối ưu hóa chính nó - chuẩn bị tuyên bố - trở thành một nút cổ chai cho các câu lệnh phức tạp. Càng nhiều bảng để tham gia, các biến thể kế hoạch thực hiện nhiều hơn để kiểm tra — nói về mặt toán học: n! (Yếu tố).

nguồn: http://use-the-index-luke.com/sql/join

-1

như các anwsers khác nói, không.
nhưng hãy nghĩ rằng nếu bạn có thể thay thế một số kết nối bên trong bằng các kết nối trái. trong hầu hết các truy vấn, đây là một lợi ích trong hiệu suất

+0

Thực ra, bạn có điều đó ngược. Kết nối bên trong thường hoạt động tốt hơn so với kết nối bên ngoài. – Allan

5

Nói chung, không có vấn đề gì. Trình tối ưu hóa có thể tìm ra thứ tự hiệu quả nhất để tham gia các bảng bất kể thứ tự chúng xuất hiện trong truy vấn.

Có thể, tuy nhiên, thứ tự của các bảng sẽ ảnh hưởng đến gói truy vấn. Điều này thường sẽ không phải là trường hợp nếu bạn có một bảng hai tham gia đơn giản nhưng khi số lượng các bảng trong một truy vấn tăng lên, số lượng các phép nối có thể tăng lên với tốc độ O (n!). Khá nhanh chóng, nó trở thành không thể cho người tối ưu hóa để xem xét tất cả các đơn đặt hàng tham gia có thể vì vậy nó đã sử dụng heuristics khác nhau để tỉa cây. Điều đó, đến lượt nó, dẫn đến các tình huống mà trình tối ưu hóa chọn một bảng điều khiển khác nếu bảng đó được liệt kê đầu tiên trong câu lệnh SQL trái với khi bảng đó là bảng thứ mười trong truy vấn. Jonathan Lewis có một bài đăng trên blog đẹp hiển thị cách the order tables appear in a query can affect the query plan.Nếu bạn muốn cẩn thận hơn, hãy liệt kê bảng lái xe trước là điều hợp lý để làm-- nó sẽ không giúp đỡ thường xuyên nhưng đôi khi nó có thể làm tốt.

+0

+1 Tôi nghĩ đến việc nhắc đến điều gì đó trong câu trả lời của tôi nhưng tôi không thể đánh vần nó đơn giản như bạn đã làm và vì mục đích và mục đích nhất định, rất có thể nó sẽ bị cắn bởi nó. –

+0

Tôi chỉ chạy vào một tình huống mà tôi đã có một bảng với 1.5M hàng tham gia với 4 bảng khác với ~ 50k hàng mỗi. Thứ tự các kết nối có tác động rõ ràng với các truy vấn dùng> 30 giây trong một số đơn đặt hàng, ~ 0,01 giây ở các đơn đặt hàng khác. –

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