2012-04-26 31 views
15

Tôi đang nghiên cứu tham gia bên trong và tôi là một người WHERE SQL-92 cũ. Tôi muốn biết những tác động và hiểu cách nó hoạt động. Vì vậy, đây chỉ là một câu hỏi lý thuyết về việc tham gia SQL. Đây có phải là ...Nested INNER JOIN vs INNER JOIN vs WHERE: chính xác, hiệu suất, rõ ràng cho một trường hợp cụ thể (không phải là một JOIN điển hình vs WHERE vấn đề)

SELECT * FROM -- Query 1 
tbl1 
INNER JOIN (
      tbl2 
      INNER JOIN (
      tbl3 INNER JOIN tbl4 ON tbl3.Col1 = tbl4.Col1 
     ) 
      ON tbl2.col1 = tbl3.col2 
) 
ON tbl1.col1 = tbl3.col3 

... giống như thế này?

SELECT * FROM -- Query 2 
tbl3 
INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1 
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2 
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3 

... hoặc điều này (không được sắp xếp theo độ phân giải logic)?

SELECT * FROM -- Query 3 
    tbl3 
    INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3 
    INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2 
    INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1 

..or này (nút tham khảo thay đổi; thấy có một bảng tham chiếu trước khi nó được trích dẫn, nhưng sản phẩm Descartes nên giống nhau)

SELECT * FROM -- Query 4 
    tbl4 
    INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3 
    INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2 
    INNER JOIN tbl3 ON tbl4.col1 = tbl3.col1 

..or này?

SELECT * FROM -- Query 5 
    tbl1,tbl2,tbl3,tbl4 
    WHERE 
    tbl3.col1 = tbl4.col1 
    tbl2.col1 = tbl3.col2 
    tbl1.col1 = tbl3.col3 

... từ thẩm mỹ, cú pháp, thực hành tốt nhất và quan điểm chức năng?

Đó là một câu hỏi rất cởi mở nhưng tôi nghĩ là khá thú vị cho cộng đồng để ném một số ánh sáng!

Trả lời

12

Tất cả các cơ sở dữ liệu Tôi đã làm việc chặt chẽ với (đây là SQL Server, Oracle, PostgreSQL, MySQL, Sybase, SQLite, InformixFirebird) sẽ tối ưu hóa nó với kế hoạch tương tự.

Các truy vấn thứ tư, tuy nhiên, sẽ không phân tích cú pháp trên tất cả các động cơ (bạn không thể tham khảo một bảng trong một khoản ON trước khi nó đã được sử dụng trong một điều khoản JOIN)

MySQL cung cấp STRAIGHT_JOIN khoản mà ảnh hưởng đến trật tự tham gia được sử dụng trong kế hoạch.

Trong Oracle, có gợi ý /*+ ORDERED */ và trong SQL Server có gợi ý tương tự FORCE ORDER. Nếu truy vấn sử dụng các gợi ý này, thứ tự kế hoạch cũng sẽ bị ảnh hưởng bởi thứ tự tham gia.

3

Từ quan điểm chính xác, chúng có khả năng giống nhau. Từ quan điểm hiệu suất, nó phụ thuộc vào RDBMS (tôi chỉ có thể nói cho SQL Server, nơi tất cả các biến thể sẽ mang lại cùng một kế hoạch thực hiện).

1

Trong Sybase, chúng cũng sẽ có cùng một kế hoạch thực hiện! Trình tối ưu hóa truy vấn đủ thông minh để xây dựng cùng một kế hoạch thực hiện cho tất cả chúng :)

Có thể thay đổi truy vấn bên trong để chọn bảng nhỏ nhất đầu tiên và làm cho bên trong kết nối với bảng đó.

Làm theo cách sử dụng kết nối bên trong hoặc tham gia lồng nhau (ảnh cuối cùng), tôi thích cái đầu tiên. Nó dễ đọc hơn để có sự kết nối bên trong với các kết nối giữa các bảng và sau đó, nếu cần, một mệnh đề where với các hạn chế (trong ví dụ của bạn, bạn không có những hạn chế này).