【发布时间】:2011-09-14 13:07:13
【问题描述】:
更新:废话!它不是一个整数,而是字符变化(10)
像这样执行查询会使用索引
SELECT t."FieldID"
FROM table t
WHERE t."FieldID" = '0123456789'
但如果我执行此操作则不使用索引
SELECT t."FieldID"
FROM table t
WHERE t."FieldID" LIKE '01%'
或者这个
SELECT t."FieldID"
FROM table t
WHERE "substring"(t."FieldID", 0, 3) = '01'
还有这个
SELECT t."FieldID"
FROM table t
WHERE t."FieldID" ~ '^01'
我的索引是这样的
CREATE UNIQUE INDEX fieldid_index
ON "table"
USING btree
("FieldID");
运行 PostgreSQL 7.4(是的升级)
我正在优化我的查询,并想知道在语句中的 SELECT 或 WHERE 子句中使用三种类型的表达式之一是否有任何性能提升。
注意:使用这些约束样式执行的查询返回大约 200,000 条记录
示例数据是一个字符变化(10):0123456789,它也被索引
1. (子字符串)
SELECT CASE
WHEN "substring"(t."FieldID"::text, 0, 3) = '01'::text
THEN 'Found Match'::text
ELSE NULL::text
END AS matching_group
2。 (喜欢)
SELECT CASE
WHEN t."FieldID"::text LIKE '01%'
THEN 'Found Match'::text
ELSE NULL::text
END AS matching_group
3. (正则表达式)
SELECT CASE
WHEN t."FieldID" ~ '^01'
THEN 'Found Match'::text
ELSE NULL::text
END AS matching_group
在 WHERE 子句中使用一个比另一个有任何性能优势吗?
1. (子字符串)
WHERE CASE
WHEN "substring"(t."FieldID"::text, 0, 3) = '01'::text
THEN 1
ELSE 0
END = 1
2。 (喜欢)
WHERE CASE
WHEN t."FieldID"::text LIKE '01%'
THEN 1
ELSE 0
END = 1
3. (正则表达式)
WHERE CASE
WHEN t."FieldID" ~ '^01'
THEN 1
ELSE 0
END = 1
在 SELECT 中使用一个选项并在 WHERE 子句中使用不同选项会提高性能吗?
【问题讨论】:
-
你不能看看执行计划,看看哪个(如果有的话)给你寻找而不是扫描吗?
-
在单个查询中使用任何选项只给我扫描,我如何调用搜索?结果集约为 200K
-
0123456789不是整数,因为整数没有前导零(123456789是整数值) -
@Martin Smith:正则表达式 '^01' 看起来确实像一个字符串。整数没有前导零。
-
这将使范围查询(Martin Smith,上图)再次成为可能。
标签: sql postgresql query-optimization query-performance