为什么 PostgreSQL 不使用三元组索引
Why PostgreSQL doesn't use trigram index
我创建了一个三元组索引,以便执行带有 '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 执行顺序扫描而不是使用索引?
我的table:
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;
你没有告诉我们 table 有多少行,但我想 PostgreSQL 总是使用顺序扫描(因为它最便宜)的行数足够少。
要查看您的索引是否可以使用,请暂时阻止优化器使用顺序扫描:
SET enable_seqscan = off;
如果你的查询在那之后没有使用索引,索引就真的不能用了(但我觉得没问题)。
我创建了一个三元组索引,以便执行带有 '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 执行顺序扫描而不是使用索引?
我的table:
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;
你没有告诉我们 table 有多少行,但我想 PostgreSQL 总是使用顺序扫描(因为它最便宜)的行数足够少。
要查看您的索引是否可以使用,请暂时阻止优化器使用顺序扫描:
SET enable_seqscan = off;
如果你的查询在那之后没有使用索引,索引就真的不能用了(但我觉得没问题)。