Почему PostgreSQL не использует индекс триграмм - PullRequest
0 голосов
/ 30 января 2019

Я создал индекс триграммы, чтобы выполнить запрос с условием 'like% text%', но PostgreSQL 9.6 не использует индекс для выполнения запроса.

CREATE EXTENSION pg_trgm;  

CREATE INDEX tb_estabelecimento_index08
  ON tb_estabelecimento
  USING gin
  (nm_estabelecimento COLLATE pg_catalog."default" 
  gin_trgm_ops);

Когда явыполнить запрос:

SELECT * FROM tb_estabelecimento WHERE 
nm_estabelecimento LIKE '%SOMETEXT%'

PostgreSQL даст мне план запроса:

Seq Scan on tb_estabelecimento  (cost=0.00..1.16 
rows=1 width=1706)
Filter: ((nm_estabelecimento)::text ~~                
'%SOMETEXT%'::text)"

Почему PostgreSQL выполняет последовательное сканирование вместо использования индекса?

Моя таблица:

CREATE TABLE tb_estabelecimento
(
  id_estabelecimento integer NOT NULL,
  nm_estabelecimento character varying(100) NOT NULL, 
  ds_url_website character varying(1000), 
  nm_municipio character varying(200), 
  id_unidade_federacao integer NOT NULL,
  CONSTRAINT tb_estabelecimento_pk PRIMARY KEY (id_estabelecimento),
  CONSTRAINT tb_estabelecimento_uk UNIQUE (nm_estabelecimento, nm_municipio, id_unidade_federacao)

Моя база данных:

CREATE DATABASE my_database_name
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'Portuguese_Brazil.1252'
       LC_CTYPE = 'Portuguese_Brazil.1252'
       CONNECTION LIMIT = -1;

1 Ответ

0 голосов
/ 30 января 2019

Вы не сообщаете нам, сколько строк в таблице, но я полагаю, что их достаточно, чтобы PostgreSQL всегда использовал последовательное сканирование (потому что оно самое дешевое).

Чтобы проверить, равен ли ваш индекс можно использовать, временно отговаривать оптимизатор от использования последовательных сканирований:

SET enable_seqscan = off;

Если ваш запрос не использует индекс после этого, индекс действительно непригоден (но для меня это нормально).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...