가 나는 25mln 행이 "Zemla"테이블왜 PostgreSQL은 간단한 쿼리를 그렇게 어렵게 계획합니까? 인덱스
CREATE INDEX zemla_level
ON public."Zemla"
USING btree
(level);
지금 내가 할 간단한 쿼리
select * from "Zemla" where level = 7
얻을 열심히 쿼리 계획
Bitmap Heap Scan on "Zemla" (cost=18316.26..636704.15 rows=978041 width=181) (actual time=216.681..758.663 rows=975247 loops=1)
Recheck Cond: (level = 7)
Heap Blocks: exact=54465
-> Bitmap Index Scan on zemla_level (cost=0.00..18071.74 rows=978041 width=0) (actual time=198.041..198.041 rows=1949202 loops=1)
Index Cond: (level = 7)
다른 간단한 쿼리하는 인덱스는 내가 생각할 때 즉시 실행해야합니다.
select count(*) from "Zemla" where level = 7
Aggregate (cost=639149.25..639149.26 rows=1 width=0) (actual time=1188.366..1188.366 rows=1 loops=1)
-> Bitmap Heap Scan on "Zemla" (cost=18316.26..636704.15 rows=978041 width=0) (actual time=213.918..763.833 rows=975247 loops=1)
Recheck Cond: (level = 7)
Heap Blocks: exact=54465
-> Bitmap Index Scan on zemla_level (cost=0.00..18071.74 rows=978041 width=0) (actual time=195.409..195.409 rows=1949202 loops=1)
Index Cond: (level = 7)
제 질문은 PostgreSQL이 첫 번째 인덱스 스캔 이후에 너무 많은 오버 헤드로 다른 비트 맵 힙 스캔을하는 이유입니다.
편집 : What is a "Bitmap heap scan" in a query plan?은 OR 연산자가있는 일부 쿼리가 비트 맵 힙 스캔을 갖는 이유에 대한 대답이기 때문에 다른 질문입니다. 내 검색어가 OR 또는 AND 연산자가 아닙니다.
"하드 플랜"이란 무엇입니까? 일반 설명 대신'explain (analyze)'을 사용하여 생성 된 실행 계획을 보여주십시오. –
고정 된 질문 본문 설명 (분석) – alexey2baranov
행 견적은 상당히 벗어났습니다. ''진공 분석 'Zemla' '가 무엇인가를 변경하는지? –