2017-11-27 5 views
1

Google 시스템에서 ILIKE와 일치하는 패턴 검색을 수행하고 있지만 테이블의 레코드 양 때문에 일부 테이블에서 너무 느려집니다. 그래서 나는이 게시물 https://www.depesz.com/2011/02/19/waiting-for-9-1-faster-likeilike/에있는 지침에 따라 trigram 색인을 구현하고 있습니다. '% xxx %'와 같은 검색이 필요하므로 전체 텍스트 검색을 사용하지 않고 있으며 전체 텍스트 검색이 제대로 작동하지 않습니다. 테스트 테이블에는 16000 개의 레코드가 있으며 일부 다른 컬럼을 연결하는 검색을 위해 테이블에 새 컬럼을 작성했습니다.postgres trigram 색인이 ilike 검색에서 너무 느립니다.

나는 몇 가지 테스트를 실행 한이 드 결과입니다

SELECT * FROM "table" WHERE "searchField" ILIKE '%ose%' 

NO INDEX 1639 행 30.3 초. 평균

진 INDEX 1639 행 26.4 초. 평균

SELECT * FROM "table" WHERE "searchField" ILIKE '%ose%' OR "searchField" ILIKE '%ria%' 

색인 없음 1639 행 3:02 분. 평균

진 INDEX 1639 행 2.56 분. 평균

큰 발전이 아님을 알 수 있듯이 게시 시간은 쿼리 시간이 밀리 초로 단축됩니다. Explain 분석 결과는 다음과 같습니다.

Bitmap Heap Scan on "table" (cost=22.31..1827.93 rows=1331 width=511) 
          (actual time=0.354..4.644 rows=1639 loops=1) 
    Recheck Cond: (("searchField")::text ~~* '%ose%'::text) 
    Heap Blocks: exact=585 
    -> Bitmap Index Scan on "table_trgm_gin" (cost=0.00..21.98 rows=1331 width=0) 
              (actual time=0.276..0.276 rows=1639 loops=1) 
     Index Cond: (("searchField")::text ~~* '%ose%'::text) 

색인 스캔 속도는 빠르지 만 조건 재검사가 너무 느립니다. 필자는 위양성 (positives)으로 인한 재검사가 불가피하다는 점을 읽었습니다. 하지만 더 나은 결과를 얻는 방법을 모르겠습니다.

인덱스가 차이를 많이 내지 않는 이유와 더 나은 쿼리 시간을 얻는 방법을 설명 할 수 있습니까?

답변

0

표시되는 EXPLAIN (ANALYZE)의 지속 시간은 5 밀리 초 미만이므로 다른 표를 사용해야합니다.

검색하는 패턴이 매우 짧습니다 (3 자).

인덱스 스캔 중에 많은 행이 일치하고 이러한 모든 행을 다시 검사해야하기 때문에 Trigram 색인이 짧은 패턴에 적합하지 않습니다. 더 이상 패턴

  • 테스트 및 성능이 향상되는지 확인 :

    두 가지 내 분석이 정확한지 확인합니다.

  • 3 분이 걸리는 쿼리의 출력을보고 인덱스 스캔 중에 많은 행이 있는지 확인하십시오.

내가 옳다면 할 수있는 일이 많지 않습니다. 짧은 패턴을 찾는 것은 잘 수행되지 않습니다. 문제를 피하기 위해 패턴에서 문자의 최소 길이를 제한하려고 시도 할 수 있습니다.

+0

'EXPALIN ANALYZE'는 같은 테이블에 대한 것이고, 내가 cuestion에 넣은 첫 번째 예제입니다. 긴 패턴을 사용하는 것이 유용하지만 실제로 중요한 것은 일치 항목의 수입니다. '% educativa %'는 3608 행의 경우 45 초가 걸리지 만 '% josefa %'는 28 행의 경우 300 밀리 초가 걸립니다. 그러나 색인없이 같은 일이 발생합니다. 사실 테스트에서 인덱스가없는 더 긴 패턴은 더 빠릅니다. 어쨌든 고맙습니다. – thedummy

+0

흠, 어떻게 그럴 수 있니? 첫 번째 쿼리에 26 초가 걸렸지 만 'EXPLAIN'은 실제 시간 = 4라고 말합니다.644 밀리 초. 'EXPLAIN (ANALYZE, BUFFERS)'로 다시 시도해 주실 수 있습니까? 어쩌면 그것으로 문제를 분명히 알 수 있습니다. –