Erwin, puisque c'était notre discussion dans le fil de commentaires d'avant, j'ai décidé de pousser un peu plus loin ...
J'ai une requête très simple à partir d'une table de taille raisonnable. J'en ai généralement assez work_mem
, mais dans ce cas j'ai utilisé les commandes
SET work_mem = 64;
pour définir un très petit work_mem
et
SET work_mem = default;
pour me mettre work_mem
à être suffisamment grand pour ma requête.
EXPLIQUER et revérifier la condition
Donc, ma requête en cours d' exécution avec seulement EXPLAIN
comme
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
J'ai obtenu les résultats à la fois bas et haut work_mem
:
Faible 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)
Haute 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)
Pour faire court, pour EXPLAIN
seulement, comme prévu, le plan de requête indique qu'une condition de nouvelle vérification est possible, mais nous ne pouvons pas savoir si elle sera réellement calculée.
EXPLIQUER L'ANALYSE ET REVÉRIFIER LA CONDITION
Lorsque nous incluons ANALYZE
dans la requête, les résultats nous en disent plus sur ce que nous devons savoir.
Faible 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)
Haute 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)
Encore une fois, comme prévu, l'inclusion de ANALYZE
nous révèle des informations très importantes. Dans le work_mem
cas bas , nous voyons qu'il y a des lignes supprimées par la vérification de l'index et que nous avons des lossy
blocs de tas.
Conclusion? (ou l'absence de)
Malheureusement, il ne semble pas suffisant à lui EXPLAIN
seul de savoir si une nouvelle vérification de l'index sera réellement nécessaire car certains des ID de ligne sont supprimés au profit de la conservation des pages lors de l'analyse du tas de bitmap.
L'utilisation EXPLAIN ANALYZE
est très bien pour diagnostiquer les problèmes avec des requêtes de longueur moyenne, mais dans le cas où une requête prend un temps extrêmement long pour terminer, puis en cours EXPLAIN ANALYZE
d' exécution pour découvrir que votre index bitmap se convertit en lossy en raison de l'insuffisance work_mem
est toujours une contrainte difficile. J'aimerais qu'il y ait un moyen d' EXPLAIN
estimer la probabilité de cet événement à partir des statistiques du tableau.