Erwin, dado que esta era nuestra discusión en el hilo de comentarios de antes, decidí analizarlo un poco más ...
Tengo una consulta muy simple de una tabla de tamaño razonable. Normalmente tengo suficiente work_mem
, pero en este caso usé los comandos
SET work_mem = 64;
para establecer un muy pequeño work_mem
y
SET work_mem = default;
para hacer que mi work_mem
espalda sea lo suficientemente grande para mi consulta.
EXPLICAR y volver a comprobar la condición
Por lo tanto, el funcionamiento de mi consulta, con sólo EXPLAIN
como
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Obtuve los resultados tanto para bajo como para alto work_mem
:
Bajo 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)
Larga historia corta, EXPLAIN
solo, como se esperaba, el plan de consulta indica que es posible una condición Recheck, pero no podemos saber si realmente se calculará.
EXPLIQUE ANÁLISIS Y Vuelva a comprobar la condición
Cuando incluimos ANALYZE
en la consulta, los resultados nos dicen más sobre lo que necesitamos saber.
Bajo 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)
Nuevamente, como se esperaba, la inclusión de ANALYZE
nos revela información muy importante. En el work_mem
caso bajo , vemos que hay filas eliminadas por la revisión del índice, y que tenemos lossy
bloques de montón.
¿Conclusión? (o la falta de ello)
Desafortunadamente, parece que EXPLAIN
por sí solo no es suficiente para saber si realmente será necesario volver a verificar el índice porque algunos de los ID de fila se descartan a favor de retener páginas durante la exploración de montón de mapa de bits.
El uso EXPLAIN ANALYZE
está bien para diagnosticar los problemas con consultas de longitud moderada, pero en el caso de que una consulta demore mucho tiempo en completarse, luego ejecutarse EXPLAIN ANALYZE
para descubrir que su índice de mapa de bits se está convirtiendo en con pérdida debido a que work_mem
es insuficiente . Desearía que hubiera una manera de EXPLAIN
estimar la probabilidad de que esto ocurra a partir de las estadísticas de la tabla.