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
'programing' 카테고리의 다른 글
Swift에서 Enum Decodable을 만들려면 어떻게 해야 합니까? (0) | 2023.05.14 |
---|---|
C#의 배열 목록 대 목록<> (0) | 2023.05.14 |
왜 도커 내에서 포트 80에서 aspnet core가 시작됩니까? (0) | 2023.05.14 |
제네릭 형식 매개 변수를 시스템으로 제한하는 방법.열거형 (0) | 2023.05.14 |
로그인 실패로 인해 SQL Server 2012를 시작할 수 없음 (0) | 2023.05.14 |