쿼리 계획에서 "비트 맵 힙 스캔"이란 무엇입니까?


113

"비트 맵 힙 스캔"의 원리를 알고 싶습니다 OR. 조건에서 쿼리를 실행할 때 자주 발생한다는 것을 알고 있습니다.

누가 "비트 맵 힙 스캔"의 원리를 설명 할 수 있습니까?

답변:


122

가장 좋은 설명은 내가 착각하지 않는 한 알고리즘의 작성자 인 Tom Lane에서 비롯 됩니다 . 또한 참조 위키 피 디아 문서를 .

간단히 말해 seq 스캔과 비슷합니다. 차이점은 모든 디스크 페이지를 방문하는 것이 아니라 비트 맵 인덱스가 AND 및 OR 적용 가능한 인덱스를 함께 스캔하고 필요한 디스크 페이지 만 방문한다는 것입니다.

이는 인덱스가 행별로 순서대로 방문되는 인덱스 스캔과 다릅니다. 즉, 디스크 페이지가 여러 번 방문 될 수 있습니다.


Re : 귀하의 의견에있는 질문 ... 네, 그게 바로 그것입니다.

인덱스 스캔은 행을 하나씩 살펴보고 필요한만큼 디스크 페이지를 반복해서 엽니 다 (일부는 물론 메모리에 남아 있지만 요점을 얻습니다).

비트 맵 인덱스 스캔은 디스크 페이지의 짧은 목록을 순차적으로 열고 각 페이지에서 적용 가능한 모든 행을 가져옵니다 (따라서 쿼리 계획에서 볼 수있는 소위 재검사 조건).

제쳐두고, 클러스터링 / 행 순서가 두 방법의 관련 비용에 미치는 영향에 유의하십시오. 행이 무작위 순서로 모든 위치에있는 경우 비트 맵 인덱스가 더 저렴합니다. (실제로 모든 곳에있는 경우 비트 맵 인덱스 스캔에 오버 헤드가없는 것이 아니기 때문에 seq 스캔이 가장 저렴합니다.)


따라서 "비트 맵 힙 스캔": 한 페이지를 두 번 이상 방문 할 수 없습니다! 그러나 "인덱스 캔": 인덱스가 행별로 순서대로 방문되기 때문에 페이지를 두 번 이상 방문 할 수 있습니다.
프랑

페이지를 여러 번 방문 할 때 캐싱이 수반 될 수 있습니다. 페이지는 실제로 디스크에서 처음로드되고 (느리게) 추가 액세스가 메모리의 캐시에 도달합니다 (Postgres 캐시 (빠름) 또는 OS 캐시 (빠름)). .
Matthieu

또한 index-only scan쿼리에서 인덱싱 된 열만 액세스되는 경우도 있습니다. 이 경우에는 index-only scan힙 (데이터 페이지) 데이터에 액세스 할 필요가 없습니다. postgresql.org/docs/12/indexes-index-only-scans.html
Alan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.