SỬ DỤNG xây dựng trong mệnh đề THAM GIA có thể giới thiệu các rào cản tối ưu hóa trong một số trường hợp nhất định?


35

Tôi đã nhận thấy rằng USINGcấu trúc (thay vì ON) trong FROMmệnh đề của SELECTcác truy vấn có thể đưa ra các rào cản tối ưu hóa trong một số trường hợp nhất định.

Ý tôi là từ khóa này:

LỰA CHỌN *
TỪ một
THAM GIA b SỬ DỤNG (a_id)

Chỉ trong trường hợp phức tạp hơn.

Bối cảnh: nhận xét này đến câu hỏi này .

Tôi sử dụng nó rất nhiều và chưa bao giờ nhận thấy bất cứ điều gì cho đến nay. Tôi sẽ rất quan tâm đến một trường hợp thử nghiệm chứng minh hiệu ứng hoặc bất kỳ liên kết đến thông tin thêm. Những nỗ lực tìm kiếm của tôi trở nên trống rỗng.

Câu trả lời hoàn hảo sẽ là một trường hợp thử nghiệm để hiển thị USING (a_id)với hiệu suất kém hơn khi so sánh với điều khoản tham gia thay thế ON a.a_id = b.a_id- nếu điều đó thực sự có thể xảy ra.


2
@kgrittn: Đó là những gì tôi thường mong đợi cho đến nay: nhanh hơnUSING một chút - vì nó dẫn đến một cột ít hơn trong ma trận kết quả. Phát hiện của bạn bắt đầu từ năm 2005 và 2008. Tôi cho rằng mọi vấn đề đã được khắc phục. Tuy nhiên , tôi có thể thấy một giới hạn có thể có: THAM GIA với có thể phải được áp dụng theo thứ tự , vì cột kết quả là một sản phẩm chung. Do đó có khả năng hạn chế các tùy chọn sắp xếp lại THAM GIA. USING
Erwin Brandstetter

1
Tôi đã tìm thấy chủ đề này có thể có liên quan đến việc khiến tôi không sử dụng nó thường xuyên như vậy, bởi vì việc XEM với điều kiện SỬ DỤNG khi tham gia có thể gây ra sự cố khi kết xuất / khôi phục: archives.postgresql.org/pgsql- bug / 2011-06 / dir00030.php Tôi vẫn có cảm giác cằn nhằn, có một luồng khác liên quan đến vấn đề hiệu năng với việc SỬ DỤNG nơi mà cách giải quyết là sử dụng ON, nhưng tôi sẽ từ bỏ việc tìm kiếm nó, tôi nghĩ vậy. Có thể an toàn khi sử dụng nó ngoài chế độ xem và chỉ cần nhớ thử BẬT thay vì làm bước chẩn đoán nếu truy vấn chậm.
kgrittn

1
Có vẻ như "sử dụng" làm cho mã dễ đọc hơn một chút nhưng tôi đoán rằng cả hai trường đều cần cùng một tên. Tôi không nghĩ rằng việc sử dụng sẽ có hiệu suất tốt hơn "bật", bởi vì DB dù sao cũng cần phải khớp, nó giống như một lựa chọn có hiệu suất tương tự như tham gia (sửa tôi nếu tôi sai), sự khác biệt là Tham gia sạch hơn và dễ bảo trì hơn.
jcho360

2
@HLGEM: Đó chỉ là một cái tên tượng trưng và chỉ có hai bảng, như trong ví dụ của tôi, không có chỗ cho sự nhầm lẫn. Tuy nhiên, tôi đã sửa đổi câu hỏi. Không muốn khuyến khích việc sử dụng idtên cột một cách đáng tiếc .
Erwin Brandstetter

2
@ChristiaanWesterbeek: Tôi không đồng ý. "Đi đến nơi" cho câu trả lời chuyên sâu của Postgres (vẫn) việc gửi thư. Chỉ có rất ít nhà phát triển Postgres hoạt động trên SO, nhưng tất cả các nhà phát triển và chuyên gia của Postgres đều đọc danh sách gửi thư
a_horse_with_no_name

Câu trả lời:


12

Erwin: Tôi sẽ đồng tình với ý kiến ​​rằng việc SỬ DỤNG gây ra trật tự cứng nhắc cũng có thể tạo ra nhiều trường hợp cạnh mà kế hoạch tối ưu sẽ bị loại trừ. Gần đây tôi đã giúp ai đó có một cái gì đó như thế này trong truy vấn của mình:

LEFT JOIN ( 
     a 
     JOIN b ON a.id = b.a_id
     JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
     table1 t1
     JOIN table2 t2 ON t1.some_field = t2.other_field
     JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times

Trong trường hợp của anh ta, các khối tham gia tồi tệ nhất đã gây ra một vòng lặp lồng nhau thông qua một số hàng 200 nghìn, khoảng 20 nghìn lần (làm toán) và vì các khóa không thể được đẩy lên chỉ mục, đó là một lần quét liên tiếp. Điều này có nghĩa là truy vấn tổng thể mất khoảng 3 giờ để chạy do thay đổi kế hoạch xếp tầng. Bằng cách phân phối nối trái, các phím có thể được đẩy xuống và truy vấn chạy trong vài giây. Tất nhiên điều này không hoàn toàn tương đương, đó là lý do tại sao người lập kế hoạch không thể coi họ là tương đương và do đó, người ta đã nghĩ ra kế hoạch đó như là một phép nối băm và sau đó thực hiện một vòng lặp lồng vào nhau, rất chậm.

Bất cứ khi nào bạn cứng nhắc buộc các liên kết phải thực hiện theo một thứ tự nhất định, bạn sẽ đưa ra các trường hợp trong đó thông tin bộ lọc chính có thể chưa có sẵn trong quá trình thực hiện kế hoạch, và vì vậy có thể làm gì sau này trong việc quét / băm chỉ mục nhanh có thể phải được thực hiện chậm hơn nhiều trong quá trình quét vòng lặp / tuần tự lồng nhau và do đó, trong khi đoạn trên không tương đương ngay lập tức, nó cho thấy vấn đề tương tự.

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.