다음 예를 통해 오해를 설명하려고 노력할 것입니다.
의 기본 사항 을 이해하지 못했습니다 Bitmap Heap Scan Node
. SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
계획이 다음과 같은 쿼리를 고려하십시오 .
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
이 노드에 대한 나의 이해 :
거기 에 설명 bitmap heap scan
된대로 , 읽기 순서대로 테이블 블록을 읽기 때문에 무작위 테이블 액세스 오버 헤드가 발생하지 않습니다 Index Scan
.
Index Scan
완료된 후 PostgreSQL은 불필요하게 heap blocks reads
(또는 hits
핫 캐시가있는 경우) 피하기 위해 행을 최적으로 가져 오는 방법을 모릅니다 . 그래서 그것을 알아 내기 위해 인덱스의 두 비트 맵을 생성하고 수행하여 생성 된 구조 ( Bitmap Index Scan
)를 생성합니다 . 비트 맵이 생성되었으므로 이제 불필요한 순서를 피하면서 순차적으로 테이블을 최적으로 읽을 수 있습니다 .bitmap
BITWISE AND
heap I/O-operations
그것은 많은 질문이 오는 곳입니다.
질문 : 비트 맵이 있습니다. PostgreSQL은 행의 물리적 순서에 대한 비트 맵을 어떻게 알 수 있습니까? 또는 비트 맵을 생성하여 해당 요소를 페이지의 포인터에 쉽게 매핑 할 수 있습니까? 그렇다면 모든 것을 설명하지만 내 추측 일뿐입니다.
그렇다면 우리는 단순히 bitmap heap scan -> bitmap index scan
순차적 스캔과 비슷하지만 테이블의 적절한 부분에 불과 하다고 말할 수 있습니까?
001001010101011010101
. 또는 실제로 중요하지 않으며 우리가 알아야 할 것은 비트 맵으로 블록을 찾을 수 있다는 것입니다.