Tôi đang sử dụng CTE đệ quy sau đây làm ví dụ tối thiểu, nhưng nói chung, trình tối ưu hóa phải sử dụng các số nguyên tố 'đoán' mặc định cho các CTE đệ quy:
with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * from w;
/*
n
---
1
2
3
4
5
*/
explain analyze
with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * from w;
/*
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
CTE Scan on w (cost=2.95..3.57 rows=31 width=4) (actual time=0.005..0.020 rows=5 loops=1)
CTE w
-> Recursive Union (cost=0.00..2.95 rows=31 width=4) (actual time=0.003..0.017 rows=5 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.001 rows=1 loops=1)
-> WorkTable Scan on w w_1 (cost=0.00..0.23 rows=3 width=4) (actual time=0.002..0.002 rows=1 loops=5)
Filter: (n < 5)
Rows Removed by Filter: 0
*/
Lưu ý các hồng y rows=31
ước tính và rows=5
thực tế trong kế hoạch trên. Trong một số trường hợp, 100 dường như được sử dụng như một ước tính, tôi không chắc logic chính xác đằng sau dự đoán.
Trong vấn đề thế giới thực của tôi, ước tính cardinality kém đang ngăn cản kế hoạch 'vòng lặp lồng nhau' nhanh chóng được chọn. Làm cách nào tôi có thể 'gợi ý' thẻ tối ưu hóa cho CTE đệ quy để giải quyết vấn đề này?
COST
chức năng, nhưng không nhiều. Tôi khuyên bạn nên nâng cấp nó trên các tin tặc pssql, nhưng bạn sẽ bị cuốn vào vòng lặp thứ n của cuộc tranh luận "gợi ý", lãng phí khối lượng không khí nóng và không đạt được gì :-(