2016-11-13 5 views
1

GIN 인덱스의 문제점은 무엇입니까? SEQ 스캔은 피할 수 없습니까?

create table mytable(hash char(40), title varchar(500)); 
create index name_fts on mytable using gin(to_tsvector('english', 'title')); 
CREATE UNIQUE INDEX md5_uniq_idx ON mytable(hash); 

내가 제목을 조회 나는이 같은 테이블을 만든

,

test=# explain analyze select * from mytable where to_tsvector('english', title) @@ 'abc | def'::tsquery limit 10; 
                QUERY PLAN 
-------------------------------------------------------------------------------------------------------------------- 
Limit (cost=0.00..277.35 rows=10 width=83) (actual time=0.111..75.549 rows=10 loops=1) 
    -> Seq Scan on mytable (cost=0.00..381187.45 rows=13744 width=83) (actual time=0.110..75.546 rows=10 loops=1) 
     Filter: (to_tsvector('english'::regconfig, (title)::text) @@ '''abc'' | ''def'''::tsquery) 
     Rows Removed by Filter: 10221 
Planning time: 0.176 ms 
Execution time: 75.564 ms 
(6 rows) 

인덱스는 사용되지 않습니다. 어떤 아이디어? 10m 행이 있습니다.

+0

전체 텍스트 검색이 작동하는 방식이 아닙니다. – Phill

+0

@Phill 당신은 정교 할 수 있습니까? – daisy

+0

쿼리가 실행 시간의 값을 변환합니다. 느린 속도로 인덱스를 사용하지 않습니다. 테이블의 별도 열에 tsvector를 저장해야합니다. – Phill

답변

1

, 그것은 인덱싱 상수가 아닌 필드, 색인 정의 오타, 그것은

ON mytable USING gin (to_tsvector('english', title)) 

대신

ON mytable USING gin (to_tsvector('english', 'title')) 

당신이 그것을 쓴 방법이 될해야 있습니다 그런 색인은 실제로 당신이 수행하는 것과 같은 수색을 위해 쓸모 없을 것입니다. 인덱스 사용할 수 수있는 경우

SET enable_seqscan=off; 

를 실행 한 후 다시 쿼리를 실행할 수 있습니다 참조하십시오.
인덱스가 아직 사용되지 않으면 인덱스를 사용할 수 없습니다.

위의 내용 외에도 실행 계획에 이상이 생길 수 있습니다. PostgreSQL은 mytable의 순차 스캔은 여러분이 말한대로 13744 개의 행을 반환하고 1000 만 개가 아닌 것으로 추정합니다. autovacuum을 비활성화 했습니까? 아니면 테이블 통계가 정확하지 않을 수있는 다른 것이 있습니까?

+0

오타가 수정되면 작동하고 'limit 10'이 인덱스 사용을 차단했습니다. – daisy