programing

Postgre는 왜?SQL이 인덱스된 열에 대해 순차적 검색을 수행하시겠습니까?

megabox 2023. 5. 14. 10:31
반응형

Postgre는 왜?SQL이 인덱스된 열에 대해 순차적 검색을 수행하시겠습니까?

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

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년 이후의 기록이 많은 경우 순차 검색이 인덱스 검색보다 빠를 수 있습니다.

@_no_name을 가진_horse_는 그것을 꽤 잘 설명했습니다.또한 인덱스 스캔을 사용하려면 일반적으로 where 절에서 경계 범위를 사용해야 합니다.예 - 연도 > 2019년 및 연도 < 2020년

대부분의 경우 통계가 표에서 업데이트되지 않고 제약 조건으로 인해 업데이트되지 않을 수 있습니다.이 경우 최적화 도구는 2019년 이후에 몇 개의 행을 사용해야 하는지 알 수 없습니다.따라서 전체 지식 대신 순차적 검색을 선택합니다.제한된 파티션은 대부분 문제를 해결합니다.

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

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

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

반응형