2009-02-27 12 views
6

Ho una query nella mia applicazione che funziona molto velocemente quando c'è un numero elevato di righe nelle mie tabelle. Ma quando il numero di file è di dimensioni moderate (né grandi né piccole), la stessa query viene eseguita fino a 15 volte più lentamente.Quali sono le insidie ​​dell'impostazione enable_nestloop su OFF

Il piano di spiegazione mostra che la query su un set di dati di medie dimensioni utilizza loop nidificati per l'algoritmo di join. Il set di dati di grandi dimensioni utilizza hash join.

Sono in grado di scoraggiare il pianificatore di query dall'utilizzo di cicli nidificati a livello di database (postgresql.conf) o per sessione (SET enable_nestloop TO off).

Quali sono le potenziali insidie ​​di set enable_nestloop to off?

Altre informazioni: PostgreSQL 8.2.6, in esecuzione su Windows.

risposta

7

Quali sono le potenziali insidie ​​dell'impostazione di enable_nestloop a off?

Ciò significa che non sarà mai possibile utilizzare gli indici in modo efficiente.

E sembra che tu non li usi ora.

La query come questa:

SELECT u.name, p.name 
FROM users u 
JOIN profiles p ON p.id = u.profile_id 
WHERE u.id = :id 

sarà molto probabilmente usare NESTED LOOPS con una su user.id ed un su profile.id, a condizione che avete costruito indici su questi campi.

Le query con filtri a bassa selettività (ovvero le query che richiedono più di 10% di dati dalle tabelle che utilizzano) beneficeranno di MERGE JOINS e HASH JOINS.

Ma le query come quelle sopra richiedono NESTED LOOPS per funzionare in modo efficiente.

Se si inviano qui le query e le definizioni delle tabelle, è probabile che si possa fare molto per gli indici e le prestazioni delle query.

4

Un paio di cose da considerare prima di prendere tali misure drastiche:

  • aggiornare l'installazione all'ultima 8.2.x (che in questo momento è 8.2.12). Ancora meglio - considera l'aggiornamento alla versione stabile successiva che è 8.3 (8.3.6).

  • prendere in considerazione la possibilità di cambiare la piattaforma di produzione in qualcosa di diverso da Windows. La porta di Windows di PostgreSQL, sebbene molto utile per scopi di sviluppo, non è ancora alla pari con gli Un * x.

  • leggere il primo paragrafo di "Planner Method Configuration". Questo wiki page probabilmente aiuterà anche.

1

Ho la stessa identica esperienza. Alcune query su un grande database sono state eseguite utilizzando cicli nidificati e sono occorse 12 ore !!!quando viene eseguito in 30 secondi quando si disattivano i cicli nidificati o si rimuovono gli indici.

suggerimenti Avendo sarebbe davvero bello qui, ma ho provato

... 
SET ENABLE_NESTLOOP TO FALSE; 
... critical query 
SET ENABLE_NESTLOOP TO TRUE; 
... 

per affrontare questo problema. Quindi è possibile disabilitare e riattivare definitivamente l'utilizzo del ciclo annidato e non si può discutere con un aumento di velocità di 9000 volte :)

Un problema che ho è quello di eseguire la modifica di ENABLE_NESTLOOP in una procedura PgSQL/PL. Posso eseguire uno script SQL in Aqua Data Studio facendo tutto bene, ma quando lo metto in una procedura PgSQL/PL, ci vogliono ancora 12 ore. Apparentemente ignorava il cambiamento.

Problemi correlati