更新:废话!它不是一个整数,它是可变的(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 条记录
示例数据是一个字符 varying(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 子句中使用不同的选项是否会提高性能?
最佳答案
我个人认为制造这种问题的人不应该被允许使用“性能”这个词。恕我直言,对数字字段(甚至可能是关键字段)内容的文本表示 的限制(如 WHERE 子句中的限制)表明设计不佳。
如果这是我的数据,我会在记录中添加一个标志字段,指示在查询 xyz 中需要/不需要。甚至可以将其放入单独的表格中。我更喜欢添加一个(冗余的?)列来创建基于 GW-basic-substring 垃圾的整个索引。
关于SQL 性能,什么在 SELECT 和 WHERE 条件下执行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7416814/