크레이그의 철저한 답변 외에도, 당신이 언급 한 책의 표지가 다음과 같이 덧붙이고 싶었습니다.
Oracle, DB2 및 SQL Server 포함
따라서 PostgreSQL에 대한 훌륭한 조언이 될 것이라고 믿지 않습니다. 모든 RDBMS는 놀라 울 정도로 다를 수 있습니다!
나는 당신의 원래 질문에 대해 약간 혼란 스럽지만 여기 책의 섹션이 100 % 정확하지 않다는 것을 보여주는 예가 있습니다. 더 혼란을 피하기 위해 여기에 관련된 모든 단락이 있습니다 . Google 도서 검색 에서 확인할 수 있습니다 .
데이터베이스는 Indexed_Col IS NOT NULL이 너무 넓은 범위를 포함하여 유용하지 않다고 가정하므로 데이터베이스는이 조건에서 인덱스로 구동되지 않습니다. 드문 경우에, 널이 아닌 값을 갖는 것이 너무 드물기 때문에 모든 가능한 널이 아닌 값에 대한 인덱스 범위 스캔이 유리합니다. 이러한 경우 가능한 모든 값의 범위에 대한 안전한 하한 또는 상한을 알아낼 수 있으면 Positive_ID_Column> -1 또는 Date_Column> TO_DATE ( '0001/01/01'와 같은 조건으로 범위 스캔을 활성화 할 수 있습니다. , 'YYYY / MM / DD').
Postgres는 실제로 (다음과 같은 경우에) IS NOT NULL
제안 된 것과 같은 범위 스캔 kludges를 추가하지 않고 쿼리 를 만족시키기 위해 인덱스를 사용할 수 있습니다 Positive_ID_Column > -1
. Postgres가이 특정 경우에이 인덱스를 선택한 이유에 대한 Craig의 질문에 대한 의견과 부분 인덱스 사용에 대한 참고 사항을 참조하십시오.
CREATE TABLE bar (a int);
INSERT INTO bar (a) SELECT NULL FROM generate_series(1,1000000);
INSERT INTO bar (a) VALUES (1);
CREATE INDEX bar_idx ON bar (a);
EXPLAIN ANALYZE SELECT * FROM bar WHERE a IS NOT NULL;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Index Only Scan using bar_idx on bar (cost=0.42..8.44 rows=1 width=4) (actual time=0.094..0.095 rows=1 loops=1)
Index Cond: (a IS NOT NULL)
Heap Fetches: 1
Total runtime: 0.126 ms
(4 rows)
그건 그렇고 Postgres 9.3이지만 "Index Only Scan"을 사용하지 않더라도 결과는 9.1에서 거의 비슷할 것으로 생각합니다.
편집 : 나는 당신이 원래의 질문을 분명히하고 Postgres가 왜 간단한 예제에서 색인을 사용하지 않는지 궁금합니다.
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
테이블에 행이 없기 때문일 수 있습니다. 테스트 데이터를 추가하십시오 ANALYZE my_table;
.