为什么postgresql在此查询中不使用索引

时间:2014-12-12 02:38:21

标签: sql postgresql postgresql-9.3

以下是完整的表格定义:

CREATE TABLE search.tablename
(
  id integer NOT NULL,
  name character varying(300) NOT NULL,
  CONSTRAINT tablename_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

CREATE INDEX tablename_name_idx
  ON search.tablename
  USING btree
  (name COLLATE pg_catalog."default");

它有大约73,000行,只是通过手动操作进行真空吸尘/分析。

我无法理解的是为什么这个简单的查询

SELECT * 
  FROM "tablename" AS "arn" 
 WHERE arn.name LIKE 'foo%'

不使用相应的索引。

此查询的执行计划是

Seq Scan on tablename arn  (cost=0.00..1626.96 rows=7 width=47) (actual time=8.682..8.682 rows=0 loops=1)
  Filter: ((name)::text ~~ 'foo%'::text)
  Rows Removed by Filter: 73197
Total runtime: 8.703 ms

有人能指出我所缺少的东西吗?

UPD :将列名类型更改为text不会改变任何内容。

UPD 2 name = 'foo'谓词预计会使用索引

1 个答案:

答案 0 :(得分:2)

尝试将varchar_pattern_ops添加到索引

CREATE INDEX tablename_name_idx
  ON search.tablename
  USING btree
  (name COLLATE pg_catalog."default" varchar_pattern_ops);
  

运算符类text_pattern_ops,varchar_pattern_ops,   bpchar_pattern_ops和name_pattern_ops支持B树索引   分别输入text,varchar,char和name。与众不同   默认的运算符类是严格比较值   字符而不是根据特定于语言环境   整理规则。这使得这些运算符类适合使用   涉及模式匹配表达式的查询(LIKE或POSIX常规   表达式)当服务器不使用标准" C"区域设置。