Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

14.3. Kiểm soát người lập kế hoạch với rõ ràngtỷ lệ kèo bóng đámệnh đề

Có thể điều khiển trình lập kế hoạch truy vấn ở một mức độ nào đó bằng cách Sử dụng rõ ràngtỷ lệ kèo bóng đáCú pháp. Để xem Tại sao điều này quan trọng, trước tiên chúng ta cần một số nền.

Trong một truy vấn tỷ lệ kèo bóng đá đơn giản, chẳng hạn như:

Chọn * từ a, b, c trong đó a.id = b.id và B.Ref = c.id;

Người lập kế hoạch miễn phí tỷ lệ kèo bóng đá các bảng đã cho theo bất kỳ thứ tự nào. Vì Ví dụ, nó có thể tạo ra một kế hoạch truy vấn tỷ lệ kèo bóng đá từ A đến B, sử dụng TheWHEREđiều kiệna.id = B.ID, và sau đó tỷ lệ kèo bóng đá C để tỷ lệ kèo bóng đá này bảng, sử dụng cái khácWHEREĐiều kiện. Hoặc nó có thể tỷ lệ kèo bóng đá B đến C và sau đó tỷ lệ kèo bóng đá A với kết quả đó. Hoặc nó có thể tỷ lệ kèo bóng đá A đến C và sau đó tỷ lệ kèo bóng đá cùng họ với B - nhưng đó sẽ là không hiệu quả, vì sản phẩm cartesian đầy đủ của A và C sẽ phải được hình thành, không có điều kiện áp dụng trongWHEREmệnh đề cho phép tối ưu hóa tỷ lệ kèo bóng đá. (Tất cả các tỷ lệ kèo bóng đá trongPostgreSQLNgười thực thi xảy ra giữa hai đầu vào các bảng, vì vậy cần phải xây dựng kết quả trong một hoặc một trong những thời trang khác.) Điểm quan trọng là những điều này Các khả năng tỷ lệ kèo bóng đá khác nhau cho kết quả tương đương về mặt ngữ nghĩa Nhưng có thể có chi phí thực hiện cực kỳ khác nhau. Do đó, Người lập kế hoạch sẽ khám phá tất cả chúng để cố gắng tìm kiếm nhiều nhất Kế hoạch truy vấn hiệu quả.

13207_13635PostgreSQLNgười lập kế hoạch sẽ chuyển từ tìm kiếm toàn diện cho mộtdi truyền13762_13874geqo_thresholdtỷ lệ kèo bóng đá số thời gian chạy.) Tìm kiếm di truyền mất ít thời gian hơn, nhưng nó sẽ không nhất thiết tìm thấy kế hoạch tốt nhất có thể.

Khi truy vấn liên quan đến tỷ lệ kèo bóng đá bên ngoài, người lập kế hoạch có ít hơn Tự do hơn nó cho đồng bằng (bên trong) tỷ lệ kèo bóng đá. Ví dụ, coi như:

14239_14315

Mặc dù các hạn chế của truy vấn này giống nhau Theo ví dụ trước, ngữ nghĩa là khác nhau bởi vì một Hàng phải được phát ra cho mỗi hàng của A không có hàng phù hợp trong Sự tỷ lệ kèo bóng đá của B và C. Do đó, người lập kế hoạch không có lựa chọn tỷ lệ kèo bóng đá Đặt hàng tại đây: Nó phải tỷ lệ kèo bóng đá B đến C và sau đó tỷ lệ kèo bóng đá A với kết quả đó. Theo đó, truy vấn này mất ít thời gian hơn để lập kế hoạch so với trước đây truy vấn. Trong các trường hợp khác, người lập kế hoạch có thể xác định Rằng nhiều hơn một thứ tự tỷ lệ kèo bóng đá là an toàn. Ví dụ, đã cho:

14880_14960

Có hợp lệ khi tỷ lệ kèo bóng đá A đến B hoặc C trước tiên. Hiện tại, chỉtỷ lệ kèo bóng đá đầy đủhoàn toàn hạn chế sự tỷ lệ kèo bóng đá đặt hàng. Hầu hết các trường hợp thực tế liên quan đếnTrái tỷ lệ kèo bóng đáhoặctỷ lệ kèo bóng đá bên phảicó thể sắp xếp lại ở một mức độ nào đó.

Cú pháp nối bên trong rõ ràng (15311_15325, tỷ lệ kèo bóng đá chéohoặc Unadornedtỷ lệ kèo bóng đá) về mặt ngữ nghĩa giống như Liệt kê các quan hệ đầu vào trongtừ, Vì vậy nó không ràng buộc thứ tự tỷ lệ kèo bóng đá.

Mặc dù hầu hết các loạitỷ lệ kèo bóng đáĐừng hoàn toàn hạn chế thứ tự tỷ lệ kèo bóng đá, có thể hướng dẫn ThePostgreSQLTruy vấn kế hoạch đến đối xử với tất cảtỷ lệ kèo bóng đámệnh đề như ràng buộc Lệnh tỷ lệ kèo bóng đá dù sao. Ví dụ, ba truy vấn này là tương đương về mặt logic:

Chọn * từ a, b, c trong đó a.id = B.Id và B.Ref = c.id;
Chọn * từ một chéo tỷ lệ kèo bóng đá B Cross tỷ lệ kèo bóng đá C WHERE a.id = B.Id và B.Ref = c.Id;
Chọn * từ một lần tỷ lệ kèo bóng đá (B tỷ lệ kèo bóng đá C trên (B.REF = C.ID)) trên (a.id = B.ID);

Nhưng nếu chúng ta nói với người lập kế hoạch để tôn vinhtỷ lệ kèo bóng đáĐặt hàng, thứ hai và thứ ba mất ít thời gian hơn để kế hoạch hơn đầu tiên. Hiệu ứng này không đáng lo ngại cho chỉ có ba bảng, nhưng nó có thể là cứu cánh với nhiều bảng.

Để buộc người lập kế hoạch tuân theo thứ tự tỷ lệ kèo bóng đá được đặt ra bởi rõ ràngtỷ lệ kèo bóng đáS, đặttỷ lệ kèo bóng đá gia_collapse_limittỷ lệ kèo bóng đá số thời gian chạy thành 1. (Các giá trị có thể khác được thảo luận dưới.)

Bạn không cần phải hạn chế thứ tự tỷ lệ kèo bóng đá hoàn toàn đặt hàng để cắt thời gian tìm kiếm, vì sử dụng là oktỷ lệ kèo bóng đáNgười vận hành trong các mục của đơn giảntừDanh sách. Ví dụ: xem xét:

Chọn * từ một chéo tỷ lệ kèo bóng đá B, C, D, E trong đó ...;

vớitỷ lệ kèo bóng đá gia_collapse_limit= 1, this buộc người lập kế hoạch tỷ lệ kèo bóng đá A đến B trước khi tỷ lệ kèo bóng đá với họ Bảng, nhưng không hạn chế các lựa chọn của nó khác. Trong này Ví dụ, số lượng đơn đặt hàng có thể có thể giảm được Yếu tố 5.

Hạn chế tìm kiếm của người lập kế hoạch theo cách này là một kỹ thuật để giảm thời gian lập kế hoạch và chỉ đạo người lập kế hoạch cho một kế hoạch truy vấn tốt. Nếu người lập kế hoạch chọn tỷ lệ kèo bóng đá xấu Đặt hàng theo mặc định, bạn có thể buộc nó chọn một đơn đặt hàng tốt hơn thông quatỷ lệ kèo bóng đáCú pháp - giả sử rằng bạn biết về Một thứ tự tốt hơn, đó là. Thử nghiệm được khuyến nghị.

Một vấn đề liên quan chặt chẽ ảnh hưởng đến thời gian lập kế hoạch là sụp đổ các nhóm phụ vào truy vấn cha mẹ của họ. Ví dụ, coi như:

Chọn *
Từ x, y,
    (Chọn * từ a, b, c trong đó một cái gì đó) như ss
Nơi mà một cái gì đó;

Tình huống này có thể phát sinh từ việc sử dụng một quan điểm có chứa một tỷ lệ kèo bóng đá; Chế độ xemChọnQuy tắc sẽ được được chèn vào vị trí của tỷ lệ kèo bóng đá chiếu xem, mang lại một truy vấn nhiều Giống như ở trên. Thông thường, người lập kế hoạch sẽ cố gắng sụp đổ Subser vào cha mẹ, năng suất:

Chọn * Từ x, y, a, b, c trong đó một cái gì đó và một cái gì đó;

18377_18482WHERE18513_19035from_collapse_limit từCác mục sẽ dẫn đến cha mẹ truy vấn. Bạn có thể đánh đổi thời gian lập kế hoạch chống lại chất lượng kế hoạch bằng cách Điều chỉnh tỷ lệ kèo bóng đá số thời gian chạy này lên hoặc xuống.

from_collapse_limittỷ lệ kèo bóng đá gia_collapse_limitđược đặt tên tương tự vì chúng làm gần như giống nhau: một điều khiển khi người lập kế hoạch sẽ"Flatten ngoài"Squeries và các điều khiển khác khi nó sẽ Flatten ra các tỷ lệ kèo bóng đá rõ ràng. Thông thường bạn sẽ đặttỷ lệ kèo bóng đá gia_collapse_limitbằngfrom_collapse_limit(Vì vậy, đó là sự tỷ lệ kèo bóng đá rõ ràng và các công cụ con hoạt động tương tự) hoặc đặttỷ lệ kèo bóng đá gia_collapse_limitđến 1 (nếu bạn muốn kiểm soát tỷ lệ kèo bóng đá đặt hàng với các tỷ lệ kèo bóng đá rõ ràng). Nhưng bạn có thể đặt chúng khác nhau nếu bạn đang cố gắng điều chỉnh sự đánh đổi giữa Thời gian lập kế hoạch và thời gian chạy.