これは、コメントから前の質問へのスピンオフです。
PostgreSQL 9.4を使用すると、Recheck Cond:
によるクエリプラン出力でビットマップインデックススキャンの後に常に行があるように見えますEXPLAIN
。
EXPLAIN
参照された質問の出力のように:
-> Bitmap Heap Scan on table_three (cost=2446.92..19686.74 rows=8159 width=7) Recheck Cond: (("timestamp" > (now() - '30 days'::interval)) AND (client_id > 0)) -> BitmapAnd (cost=2446.92..2446.92 rows=8159 width=0) -> Bitmap Index Scan on table_one_timestamp_idx (cost=0.00..1040.00 rows=79941 width=0) Index Cond: ("timestamp" > (now() - '30 days'::interval)) -> Bitmap Index Scan on fki_table_three_client_id (cost=0.00..1406.05 rows=107978 width=0) Index Cond: (client_id > 0)
またはEXPLAIN ANALYZE
、シンプルで巨大なテーブルの出力(非常に少ないwork_mem
):
EXPLAIN ANALYZE SELECT * FROM aa WHERE a BETWEEN 100000 AND 200000;
Bitmap Heap Scan on aa (cost=107.68..4818.05 rows=5000 width=4) (actual time=27.629..213.606 rows=100001 loops=1) Recheck Cond: ((a >= 100000) AND (a <= 200000)) Rows Removed by Index Recheck: 758222 Heap Blocks: exact=693 lossy=3732 -> Bitmap Index Scan on aai (cost=0.00..106.43 rows=5000 width=0) (actual time=27.265..27.265 rows=100001 loops=1) Index Cond: ((a >= 100000) AND (a <= 200000))
それは、ビットマップインデックススキャン後に2回目にインデックス条件をチェックする必要があるということですか?出力
から他に何を学ぶことができEXPLAIN
ますか?