PostgreSQL视图+ regexp->优化器问题?

时间:2019-06-14 10:24:36

标签: postgresql

在使用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]$';

如果我从视图辞职,我将使用相同的查询和正则表达式-一切正常。

所以在我看来,这是优化程序问题(除非我在这里没有做错任何事情)

有人可以建议如何告诉优化器正确进行吗?

****编辑****

请注意,鉴于正则表达式只是一个例子,我知道我可以在上述示例中辞去正则表达式的形式,但我也有更复杂的表达式。

1 个答案:

答案 0 :(得分:2)

据我所知,Postgres实际上实现了所有常见的表表达式。因此,性能的提高可能与在应用正则表达式过滤器之前已经对原始查询的WHERE子句进行了所有过滤有关。

这是重写查询的一种方法,它可能比完整的正则表达式版本要好一些:

SELECT *  
FROM api.view1
JOIN ....
WHERE ....
    AND num IN (1244566, 1244567);

请注意,您实际上甚至不需要在这里使用正则表达式。相反,请尝试仅将num与您期望的两个文字值进行比较。上述方法的另一个优点是,它可能为使用索引打开了大门,这可能会使查询更快。您当前的正则表达式方法可能会排除索引,至少对于num列而言。