Erwin, da dies unsere Diskussion im Kommentarthread von vorhin war, habe ich mich dazu entschlossen, noch ein bisschen weiter zu stöbern ...
Ich habe eine sehr einfache Abfrage aus einer relativ großen Tabelle. Normalerweise habe ich genug work_mem
, aber in diesem Fall habe ich die Befehle verwendet
SET work_mem = 64;
eine sehr kleine work_mem
und
SET work_mem = default;
um mir den work_mem
Rücken zu kehren, um für meine Anfrage groß genug zu sein.
EXPLAIN & Recheck Condition
Also läuft meine Abfrage nur mit EXPLAIN
as
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Ich habe die Ergebnisse sowohl für niedrig als auch für hoch erhalten work_mem
:
Niedrig 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)
Hoch 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)
Lange EXPLAIN
Rede kurzer Sinn, denn der Abfrageplan zeigt erwartungsgemäß an, dass eine erneute Überprüfung möglich ist, aber wir können nicht wissen, ob tatsächlich eine Berechnung durchgeführt wird.
ANALYSE ERKLÄREN & Zustand erneut prüfen
Wenn wir ANALYZE
in die Abfrage einbeziehen, teilen uns die Ergebnisse mehr mit, was wir wissen müssen.
Niedrig 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)
Hoch 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)
Wie erwartet ANALYZE
enthüllt uns die Aufnahme einiger sehr wichtiger Informationen. Im unteren work_mem
Fall sehen wir, dass durch die erneute Indexprüfung Zeilen entfernt wurden und dass wir lossy
Heap-Blöcke haben.
Fazit? (oder deren Fehlen)
Leider scheint es EXPLAIN
allein nicht ausreichend zu sein, zu wissen, ob eine erneute Überprüfung des Index tatsächlich erforderlich ist, da einige der Zeilen-IDs zugunsten der Beibehaltung von Seiten während des Bitmap-Heap-Scans gelöscht werden.
Die Verwendung von EXPLAIN ANALYZE
ist für die Diagnose von Problemen mit Abfragen mittlerer Länge in Ordnung. Wenn die Ausführung einer Abfrage jedoch sehr lange dauert EXPLAIN ANALYZE
, work_mem
ist es immer noch schwierig, festzustellen , dass der Bitmap-Index aufgrund unzureichender Daten in einen verlustbehafteten Index konvertiert wird. Ich wünschte, es gäbe eine Möglichkeit, EXPLAIN
die Wahrscheinlichkeit dieses Auftretens aus der Tabellenstatistik abzuschätzen.