development

PostgreSQL이 인덱스 열에서 순차적 스캔을 수행하는 이유는 무엇입니까?

big-blog 2020. 7. 4. 09:28
반응형

PostgreSQL이 인덱스 열에서 순차적 스캔을 수행하는 이유는 무엇입니까?


매우 간단한 예-하나의 테이블, 하나의 인덱스, 하나의 쿼리 :

CREATE TABLE book
(
  id bigserial NOT NULL,
  "year" integer,
  -- other columns...
);

CREATE INDEX book_year_idx ON book (year)

EXPLAIN
 SELECT *
   FROM book b
  WHERE b.year > 2009

나에게 준다 :

Seq Scan on book b  (cost=0.00..25663.80 rows=105425 width=622)
  Filter: (year > 2009)

대신 인덱스 스캔을 수행하지 않는 이유는 무엇입니까? 내가 무엇을 놓치고 있습니까?


SELECT가 테이블에있는 모든 행의 약 5-10 % 이상을 리턴하면 순차 스캔이 인덱스 스캔보다 훨씬 빠릅니다.

인덱스 스캔에는 각 행에 대해 여러 개의 IO 조작이 필요하기 때문입니다 (인덱스 에서 행을 찾은 다음 힙에서 행을 검색하십시오). 순차 스캔에는 각 행마다 단일 IO 만 필요하지만 디스크의 블록 (페이지)에 둘 이상의 행이 포함되어 있으므로 단일 IO 조작으로 둘 이상의 행을 페치 할 수 있습니다.

Btw : 이것은 다른 DBMS에서도 마찬가지입니다. "인덱스 만 스캔"과 같은 일부 최적화 (하지만 SELECT의 경우 * DBMS가 "인덱스 만 스캔"으로 갈 가능성은 거의 없습니다)


테이블 / 데이터베이스 분석 했습니까 ? 그리고 통계는 어떻습니까? 2009 년보다 많은 레코드가있는 경우 순차적 스캔이 인덱스 스캔보다 빠를 수 있습니다.


인덱스 스캔에서 읽기 헤드는 한 행에서 다른 행으로 점프하며 다음 순차 스캔에서 다음 물리적 블록을 읽는 것보다 1000 배 느립니다.

따라서 (검색 할 레코드 수 * 1000)이 총 레코드 수보다 적 으면 인덱스 스캔이 더 잘 수행됩니다.

참고 URL : https://stackoverflow.com/questions/5203755/why-does-postgresql-perform-sequential-scan-on-indexed-column

반응형