반응형
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)이 총 레코드 수보다 적 으면 인덱스 스캔이 더 잘 수행됩니다.
반응형
'development' 카테고리의 다른 글
문자열을 어떻게 연결합니까? (0) | 2020.07.04 |
---|---|
knockout.js를 ASP.NET MVC ViewModels와 함께 사용하는 방법? (0) | 2020.07.04 |
힘내 : 특정 커밋에 리베이스하는 방법? (0) | 2020.07.04 |
CDN에서 부트 스트랩을 사용하거나 서버에서 복사해야합니까? (0) | 2020.07.04 |
Chrome의 '미 발견 TypeError : 잘못된 호출' (0) | 2020.07.04 |