Erwin, dato che questa era la nostra discussione nel thread dei commenti di prima, ho deciso di spingerlo un po 'più avanti ...
Ho una query molto semplice da una tabella di dimensioni ragionevoli. In genere ne ho sufficienti work_mem
, ma in questo caso ho usato i comandi
SET work_mem = 64;
per impostare un molto piccolo work_mem
e
SET work_mem = default;
per impostare le mie work_mem
spalle in modo che siano sufficientemente grandi per la mia domanda.
SPIEGARE e ricontrollare le condizioni
Quindi, eseguendo la mia query con solo EXPLAIN
come
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Ho ottenuto i risultati sia per basso che per alto work_mem
:
Basso work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
alto work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
Per farla breve, EXPLAIN
solo, come previsto, il piano di query indica che è possibile una condizione di ricontrollo, ma non possiamo sapere se verrà effettivamente calcolato.
SPIEGARE ANALISI e ricontrollare le condizioni
Quando includiamo ANALYZE
nella query, i risultati ci informano di più su ciò che dobbiamo sapere.
Basso work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=3.130..13.946 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Rows Removed by Index Recheck: 86727
Heap Blocks: exact=598 lossy=836
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=3.066..3.066 rows=51840 loops=1)
Index Cond: (meter < 20)
alto work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=2.647..7.247 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Heap Blocks: exact=1434
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=2.496..2.496 rows=51840 loops=1)
Index Cond: (meter < 20)
Ancora una volta, come previsto, l'inclusione di ci ANALYZE
rivela alcune informazioni molto importanti. In work_mem
minuscolo, vediamo che ci sono righe rimosse dal controllo dell'indice e che abbiamo lossy
blocchi di heap.
Conclusione? (o la mancanza di)
Sfortunatamente, sembra che EXPLAIN
da solo non sia sufficiente sapere se un controllo dell'indice sarà effettivamente necessario perché alcuni degli ID di riga vengono eliminati a favore del mantenimento delle pagine durante la scansione dell'heap bitmap.
L'uso EXPLAIN ANALYZE
va bene per diagnosticare i problemi con query di lunghezza moderata, ma nel caso in cui una query stia impiegando molto tempo per essere completata, l'esecuzione EXPLAIN ANALYZE
per scoprire che l'indice bitmap si sta convertendo in perdita a causa di insufficiente work_mem
è ancora un vincolo difficile. Vorrei che ci fosse un modo per EXPLAIN
stimare la probabilità di questo evento dalle statistiche della tabella.