PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché il pianificatore fornisce risultati diversi per funzioni con volatilità diverse?

Stima 1000 righe

1000 righe stimate è un valore predefinito documentato in CREATE FUNCTION :

Quando una funzione è dichiarata volatile, sta chiedendo di non essere inline, quindi questo valore predefinito per result_rows tiene.

D'altra parte, quando viene inserito in una query come nel tuo secondo test, il numero di righe verrà stimato come se il corpo della funzione fosse stato spostato nella query e la dichiarazione della funzione non esistesse. Questo porta nel secondo test a una stima esatta dal VALUES la clausola può essere valutata direttamente.

Che cosa sta facendo esattamente il pianificatore qui e dove posso leggere della documentazione su di esso?

In generale, le strategie di ottimizzazione del pianificatore non sono spiegate nella documentazione principale. Sono discussi nelle mailing list e menzionati nei commenti al codice sorgente, che fortunatamente tendono ad essere eccezionalmente chiari e ben scritti (rispetto al codice sorgente medio). Nel caso dell'inlining delle funzioni, credo ai commenti di inline_set_returning_functions e inline_set_returning_function rivela la maggior parte delle regole che guidano questa particolare ottimizzazione. (attenzione:i link sopra sono nel ramo principale corrente che è soggetto a modifiche o deriva in qualsiasi momento).