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_memet
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 EXPLAINcomme
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 EXPLAINseulement, 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 ANALYZEdans 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 ANALYZEnous révèle des informations très importantes. Dans le work_memcas bas , nous voyons qu'il y a des lignes supprimées par la vérification de l'index et que nous avons des lossyblocs de tas.
Conclusion? (ou l'absence de)
Malheureusement, il ne semble pas suffisant à lui EXPLAINseul 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 ANALYZEest 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 ANALYZEd' exécution pour découvrir que votre index bitmap se convertit en lossy en raison de l'insuffisance work_memest toujours une contrainte difficile. J'aimerais qu'il y ait un moyen d' EXPLAINestimer la probabilité de cet événement à partir des statistiques du tableau.