以下是完整的表格定义:
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'
谓词预计会使用索引
答案 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"区域设置。