2011-03-05 1 views
90

아주 간단한 예 - 하나 개의 테이블, 하나 개의 인덱스, 하나 개의 쿼리는 :왜 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) 

는 왜 인덱스 대신 검사 수행하지 않는 이유는 무엇입니까? 내가 무엇이 누락 되었습니까?

답변

135

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

인덱스 스캔은 각 행에 대해 수의 작업이 필요하기 때문에 (인덱스의 행을 찾아서 힙에서 행을 검색하기 때문입니다). 디스크의 블록 (페이지)에 둘 이상의 행이 들어 있기 때문에 순차적 스캔은 각 행에 대해 단일 IO 만 필요로하는 반면, 단일 IO 작업으로 둘 이상의 행을 가져올 수 있습니다.

Btw는이뿐만 아니라 다른 DBMS 마찬가지입니다 - "인덱스 만 스캔"따로 촬영 같은 일부 최적화 (그러나 SELECT에 대한 * 그것은 매우 같지도 같은 DBMS는 "검사 만 인덱스"는 갈 것)

+6

5-10 %는 몇 가지 구성 설정과 데이터 저장에 따라 다릅니다. 어려운 번호가 아닙니다. –

+4

@ 프랭크 : 그 이유는 "대략"이라고 말한 이유입니다. 그러나 그것을 지적 해 주셔서 감사합니다. –

+0

재미 있고, 저에게 많은 것들이 설명되어 있습니다 :) 실제로 올해> 2010 년까지 인덱스 스캔을 선택합니다. 감사합니다. – wajda

8

ANALYZE 테이블/데이터베이스를 사용 했습니까? 그리고 statistics은 어떨까요? 연도> 2009 일 때 많은 레코드가있는 경우 순차 스캔은 인덱스 스캔보다 빠를 수 있습니다.