ฉันใช้ CTE แบบเรียกซ้ำต่อไปนี้เป็นตัวอย่างขั้นต่ำ แต่โดยทั่วไปเครื่องมือเพิ่มประสิทธิภาพจะต้องใช้ค่าเริ่มต้นที่เป็น 'เดา' สำหรับ CTE แบบเรียกซ้ำ
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
*/
หมายเหตุสำคัญrows=31
และที่rows=5
เกิดขึ้นจริงในแผนดังกล่าวข้างต้น ในบางกรณีดูเหมือนว่าจะใช้เป็นค่าประมาณ 100 ฉันไม่แน่ใจว่าตรรกะที่แน่นอนที่อยู่เบื้องหลังการคาดเดา
ในปัญหาโลกแห่งความจริงการคาดคะเนความน่าสงสารของ cardinality ทำให้การเลือก 'nested loops' ที่รวดเร็วนั้นไม่เพียงพอ ฉันจะ 'บอกใบ้' ความสำคัญสูงสุดของเครื่องมือเพิ่มประสิทธิภาพสำหรับ CTE แบบเรียกซ้ำเพื่อแก้ปัญหานี้ได้อย่างไร
COST
ฟังก์ชั่น แต่ไม่มาก ผมขอแนะนำให้ยกมันบน pgsql แฮกเกอร์ แต่คุณต้องการเพียงแค่ได้รับจมในการย้ำ n'th ของ "คำแนะนำ" การอภิปรายการสูญเสียมวลของอากาศร้อนและประสบความสำเร็จอะไร :-(