【发布时间】:2011-09-13 21:06:36
【问题描述】:
PostgreSQL 7.4(是的升级)
所以在我的 WHERE 条件下,我有这个
AND CASE
WHEN "substring"(t."FieldID"::text, 0, 3) = '01'::text
OR "substring"(t."FieldID"::text, 0, 4) = '123'::text
OR "substring"(t."FieldID"::text, 0, 5) = '5555'::text
OR "substring"(t."FieldID"::text, 0, 6) = '44444'::text
OR "substring"(t."FieldID"::text, 0, 3) = '99'::text
THEN 1
ELSE 0
END = 1
替代语法但成本没有变化
AND CASE
WHEN "substring"(t."FieldID"::text, 0, 3) = '01'::text THEN 1
WHEN "substring"(t."FieldID"::text, 0, 4) = '123'::text THEN 1
WHEN "substring"(t."FieldID"::text, 0, 5) = '5555'::text THEN 1
WHEN "substring"(t."FieldID"::text, 0, 6) = '44444'::text THEN 1
WHEN "substring"(t."FieldID"::text, 0, 3) = '99'::text THEN 1
ELSE 0
END = 1
寻找一种成本有效的方法来通过字符串的开头限制结果。因此,如果字符串以 01、123、5555、44444 或 99 开头,则将其添加到结果集中。
有什么想法吗?
注意:FieldID 已编入索引 查看解释数据以查看查询中的瓶颈,当添加上述代码时,排序成本会大幅上升并减慢数据集/结果的返回速度。
解释的输出:
Sort (cost=88716.84..88719.89 rows=822 width=64)
由于查询很复杂,还有很多问题,但是如果我删除部分代码,排序成本就会下降
【问题讨论】:
-
a 在架构定义时已知的前缀(
'01'、'123'等)还是依赖于单个查询? -
这是一个包含整数的数据字段
-
我的意思是每个查询的前缀总是相同的,或者您是否在每个查询中寻找不同的前缀集?
-
sry 是的,我只需要查找那些前缀,它们不会改变,但将来可以添加。这么多
标签: sql postgresql case-statement query-performance