Ho una query che esegue molto più lentamente (~ 5 minuti) quando la eseguo con il default enable_nestloop = true e enable_nestloop = false (~ 10 secondi).Postgresql - Query eseguita molto più velocemente con enable_nestloop = false. Perché il pianificatore non sta facendo la cosa giusta?
Spiegate risultato analizzare per entrambi i casi:
macchina A nestloop = true - http://explain.depesz.com/s/nkj0 (~ 5 minuti) macchina A nestloop = false - http://explain.depesz.com/s/wBM (~ 10 secondi)
in diversi macchina leggermente più lento , copiando il database e lasciando il default enable_nestloop = true ci vogliono ~ 20 sec.
macchina B nestloop = true - (~ 20secs)
Per tutti i casi di cui sopra ho assicurato che ho fatto un ANALYZE prima di eseguire le query. Non c'erano altre query in esecuzione in parallelo.
Entrambe le macchine utilizzano Postgres 8.4. La macchina A esegue Ubuntu 10.04 a 32 bit mentre la macchina B esegue Ubuntu 8.04 a 32 bit.
La query effettiva è disponibile qui. Si tratta di una query di reporting con molti join poiché il database viene utilizzato principalmente per l'elaborazione delle transazioni.
Senza ricorrere a mettere in qualcosa di simile viste materializzate cosa posso fare per rendere il pianificatore fare ciò che ho raggiunto impostando enable_nestloop = false?
Dalla ricerca che ho fatto sembra che il motivo per cui il pianificatore sta scegliendo la query apparentemente non ottimale è a causa dell'enorme differenza tra le righe stimate e quelle effettive. Come posso avvicinare questa figura?
Se dovessi riscrivere la query, cosa dovrei cambiare?
Perché il pianificatore sembra fare la cosa giusta per la Macchina B. Che cosa dovrei confrontare in entrambe le macchine?
Collegamenti dalla domanda precedente che è stato necessario rimuovere - query - http://pastie.org/2754424 – Mohan
Spiegare l'analisi per la macchina B - http://explain.depesz.com/s/dYO – Mohan