【问题标题】:Why PostgreSQL doesn't use trigram index为什么 PostgreSQL 不使用三元索引
【发布时间】:2019-06-23 06:24:21
【问题描述】:

我创建了一个三元组索引,以便执行带有“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;

【问题讨论】:

    标签: postgresql database-indexes


    【解决方案1】:

    你没有告诉我们表有多少行,但我猜PostgreSQL总是使用顺序扫描(因为它最便宜)。

    要查看是否可以使用您的索引,请暂时阻止优化器使用顺序扫描:

    SET enable_seqscan = off;
    

    如果之后您的查询不使用索引,则索引确实无法使用(但在我看来还可以)。

    【讨论】:

    • 你是对的。该表中的行数很少。 set seq scan off 后,PostgreSQL 使用索引。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多