복붙노트

[SQL] 왜 PostgreSQL는 작은 테이블에 내 인덱스를 사용하지 않는?

SQL

왜 PostgreSQL는 작은 테이블에 내 인덱스를 사용하지 않는?

나는 PostgreSQL을에 다음과 같은 테이블이 있습니다 :

CREATE TABLE index_test
(
    id int PRIMARY KEY NOT NULL,
    text varchar(2048) NOT NULL,
    last_modified timestamp NOT NULL,
    value int,
    item_type varchar(2046)
);
CREATE INDEX idx_index_type ON index_test ( item_type );
CREATE INDEX idx_index_value ON index_test ( value )

나는 다음과 같은 선택을합니다

explain select * from index_test r where r.item_type='B';
explain select r.value from index_test r where r.value=56;

실행 계획의 설명은 다음과 같습니다 :

Seq Scan on index_test r  (cost=0.00..1.04 rows=1 width=1576)
    Filter: ((item_type)::text = 'B'::text)'

지금까지 내가 이해, 이것은 전체 테이블 스캔입니다. 질문 : 내 인덱스를 사용하지 않는 이유는 무엇입니까?

할 수있다, 그 이유는 내가 내 테이블에 너무 적은 수의 행을 가지고있다? 나는 20 그 있습니다. 당신은 쉽게 인덱스의 문제를 확인하기 위해 임의의 데이터 내 테이블을 채울 수있는 SQL 문을 알려 주시기 바랍니다

이 기사 발견 : http://it.toolbox.com/blogs/db2luw/how-to-easily-populate-a-table-with-random-data-7888를,하지만 나를 위해 작동하지 않습니다. 명령문의 효율 만 단순 중요하지 않습니다.

해결법

  1. ==============================

    1.예. 테이블에서 20 행의 총에 대한 서열 검사는 항상 빠르고 인덱스 스캔보다 더 될 것입니다. 기회는 서열 검사는 단일 I / O 작업을해야하므로 해당 행은, 어쨌든 하나의 데이터베이스 블록에 위치하는 점이다.

    예. 테이블에서 20 행의 총에 대한 서열 검사는 항상 빠르고 인덱스 스캔보다 더 될 것입니다. 기회는 서열 검사는 단일 I / O 작업을해야하므로 해당 행은, 어쨌든 하나의 데이터베이스 블록에 위치하는 점이다.

    당신이 사용하는 경우

    explain (analyze true, verbose true, buffers true) select ....
    

    당신은 정말 무슨 일이 일어나고 있는지에 대해 좀 더 자세한 내용을 볼 수 있습니다.

    BTW : 그 포스트 그레스의 데이터 타입 (및 예약어) 또한 당신은 열 이름과 같은 텍스트를 사용하지 말아야합니다.

  2. ==============================

    2.당신이 발견 한 예는 당신이 그것을 할 generate_series를 사용하여 페이지에서, DB2를위한 것입니다. 이 같은 예를 들어 :

    당신이 발견 한 예는 당신이 그것을 할 generate_series를 사용하여 페이지에서, DB2를위한 것입니다. 이 같은 예를 들어 :

    INSERT INTO index_test(data,last_modified,value,item_type) 
    SELECT
        md5(random()::text),now(),floor(random()*100),md5(random()::text) 
        FROM generate_series(1,1000);
    SELECT max(value) from index_test;
    

    http://sqlfiddle.com/#!12/52641/3

    위의 바이올린의 두 번째 쿼리는 검색 인덱스를 사용한다.

  3. from https://stackoverflow.com/questions/15474812/why-is-postgresql-not-using-my-indexes-on-a-small-table by cc-by-sa and MIT license