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)으로 인한 재검사가 불가피하다는 점을 읽었습니다. 하지만 더 나은 결과를 얻는 방법을 모르겠습니다.
인덱스가 차이를 많이 내지 않는 이유와 더 나은 쿼리 시간을 얻는 방법을 설명 할 수 있습니까?
'EXPALIN ANALYZE'는 같은 테이블에 대한 것이고, 내가 cuestion에 넣은 첫 번째 예제입니다. 긴 패턴을 사용하는 것이 유용하지만 실제로 중요한 것은 일치 항목의 수입니다. '% educativa %'는 3608 행의 경우 45 초가 걸리지 만 '% josefa %'는 28 행의 경우 300 밀리 초가 걸립니다. 그러나 색인없이 같은 일이 발생합니다. 사실 테스트에서 인덱스가없는 더 긴 패턴은 더 빠릅니다. 어쨌든 고맙습니다. – thedummy
흠, 어떻게 그럴 수 있니? 첫 번째 쿼리에 26 초가 걸렸지 만 'EXPLAIN'은 실제 시간 = 4라고 말합니다.644 밀리 초. 'EXPLAIN (ANALYZE, BUFFERS)'로 다시 시도해 주실 수 있습니까? 어쩌면 그것으로 문제를 분명히 알 수 있습니다. –