在使用regexp时,我可以从几个表中选择数据,并且注意到性能问题
执行简单查询可能需要30秒钟(仅返回200行...)
SELECT *
FROM api.view1
JOIN ....
WHERE ....
AND num ~ '^124456[67]$';
我注意到有问题的部分是“ num〜'^ 124456 [67] $';”
将其重写到以下可将时间缩短至几毫秒!
with x as (
SELECT *
FROM api.view1
JOIN ....
WHERE ....
)
select * from x WHERE num ~ '^124456[67]$';
如果我从视图辞职,我将使用相同的查询和正则表达式-一切正常。
所以在我看来,这是优化程序问题(除非我在这里没有做错任何事情)
有人可以建议如何告诉优化器正确进行吗?
****编辑****
请注意,鉴于正则表达式只是一个例子,我知道我可以在上述示例中辞去正则表达式的形式,但我也有更复杂的表达式。
答案 0 :(得分:2)
据我所知,Postgres实际上实现了所有常见的表表达式。因此,性能的提高可能与在应用正则表达式过滤器之前已经对原始查询的WHERE
子句进行了所有过滤有关。
这是重写查询的一种方法,它可能比完整的正则表达式版本要好一些:
SELECT *
FROM api.view1
JOIN ....
WHERE ....
AND num IN (1244566, 1244567);
请注意,您实际上甚至不需要在这里使用正则表达式。相反,请尝试仅将num
与您期望的两个文字值进行比较。上述方法的另一个优点是,它可能为使用索引打开了大门,这可能会使查询更快。您当前的正则表达式方法可能会排除索引,至少对于num
列而言。