我在数据库上错误地使用正则表达式吗?

时间:2012-09-17 02:49:16

标签: sql regex postgresql

这有效:
SELECT * FROM aTable WHERE junk='foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo b.*';
有什么问题?

编辑:有没有提交过sql查询的情况,但没有给出 的回复?例如无限循环,错误的语法等。

2 个答案:

答案 0 :(得分:2)

没有错。

使用正则表达式的2个查询都不能使用索引进行优化。

因此您需要进行全面扫描,因此需要一些时间。

答案 1 :(得分:2)

这三个都是正确的,但是如果你使用EXPLAIN检查查询计划,你会发现计划是非常不同的。

请参阅this SQLFiddle - 请注意不同的执行时间。使用“查看执行计划”检查查询计划。

在您的情况下,=可能正在使用b树索引查找单个值,这应该非常快,而~版本可能正在执行顺序扫描 - 而且CPU非常强大 - 那是昂贵的,因为它必须针对每一行尝试正则表达式。

我只是在回答另一篇文章时写了这篇文章。请参阅this answer,其中说明LIKESIMILAR TO可以使用适当创建的索引作为您正在进行的前缀匹配,但~则不能。

尝试使用CREATE INDEX atable_junk_txt_idx ON aTable(junk text_pattern_ops)创建类似LIKE 'foo b%'的索引。

请注意,每个额外的索引都会减慢每次插入,更新和删除的速度,因此不要创建您不需要的索引。

请参阅Pg wiki上的Using explain