2016-12-27 18 views
6

Tôi đang cố gắng xem liệu sự hiểu biết của tôi về JOINs có đúng không.Điều gì thực sự xảy ra trong bảng JOINs?

Đối với các truy vấn sau đây:

SELECT * FROM tableA 
    join tableB on tableA.someId = tableB.someId 
    join tableC on tableA.someId = tableC.someId; 

Liệu các RDMS về cơ bản thực hiện giả tương tự như sau:

List tempResults 
for each A_record in tableA 
    for each B_record in tableB 
     if (A_record.someId = B_record.someId) 
      tempResults.add(A_record) 

List results 
for each Temp_Record in tempResults 
    for each C_record in tableC 
     if (Temp_record.someId = C_record.someId) 
      results.add(C_record) 

return results; 

Vì vậy, về cơ bản các hồ sơ nhiều hơn với cùng someIdtableA có với tableBtableC, các nhiều bản ghi RDMS có quét? Nếu tất cả 3 bảng có bản ghi với cùng một someId thì về cơ bản quét toàn bộ bảng được thực hiện trên tất cả 3 bảng?

Sự hiểu biết của tôi có đúng không?

+0

Câu hỏi hay. Nhưng tôi không chắc chắn nếu có ai có thể trả lời câu hỏi này. ';)' Chắc chắn tôi cảm thấy điều tương tự đang xảy ra ở phía sau. –

+0

Bạn muốn hiểu câu lệnh ghép nối T-SQL nhiều hơn? Điều này [tham gia] (https://mva.microsoft.com/en-US/training-courses/querying-with-transactsql-10530?l=BooD4g87_7904984382) là một phần tốt để hiểu chúng. – Edward

+0

[** Bài đăng này **] (http://stackoverflow.com/questions/29795400/loop-join-in-sql-server-2008) ii hữu ích. – Vikrant

Trả lời

4

Mỗi bộ xử lý truy vấn của nhà cung cấp tất nhiên được viết (được mã hóa) hơi khác nhau, nhưng chúng có thể chia sẻ nhiều kỹ thuật phổ biến. Việc thực hiện một phép nối có thể được thực hiện theo nhiều cách khác nhau, và cái nào được chọn, trong bất kỳ triển khai nào của nhà cung cấp, sẽ phụ thuộc vào tình huống cụ thể, nhưng các yếu tố sẽ được xem xét bao gồm liệu dữ liệu đã được sắp xếp theo thuộc tính nối kết hay chưa số lượng bản ghi tương đối trong mỗi bảng (một kết nối giữa 20 bản ghi trong một tập hợp dữ liệu với một triệu bản ghi trong một bản ghi khác sẽ được thực hiện khác với mỗi bộ bản ghi có kích thước tương đương). Tôi không biết nội bộ cho MySQL, nhưng đối với máy chủ SQL, có ba kỹ thuật kết hợp khác nhau, Hợp nhất Tham gia, một Vòng lặp Tham giaHash Tham gia. Hãy xem this.

+0

Vì vậy, giả mã tôi cung cấp là một ví dụ về một *** Loop Tham gia ***? – Glide

+0

Có, những gì bạn đã làm là tham gia vòng lặp. Cách tiếp cận này là phù hợp nếu một bộ nhỏ được nối với một bộ rất lớn. Bạn lặp lại qua một trong những nhỏ, tất nhiên, và cho mỗi bản ghi có sử dụng một chỉ mục để tìm các trận đấu trong một lớn. –

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