这有效:
SELECT * FROM aTable WHERE junk='foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo b.*';
有什么问题?
答案 0 :(得分:2)
没有错。
使用正则表达式的2个查询都不能使用索引进行优化。
因此您需要进行全面扫描,因此需要一些时间。
答案 1 :(得分:2)
这三个都是正确的,但是如果你使用EXPLAIN
检查查询计划,你会发现计划是非常不同的。
请参阅this SQLFiddle - 请注意不同的执行时间。使用“查看执行计划”检查查询计划。
在您的情况下,=
可能正在使用b树索引查找单个值,这应该非常快,而~
版本可能正在执行顺序扫描 - 而且CPU非常强大 - 那是昂贵的,因为它必须针对每一行尝试正则表达式。
我只是在回答另一篇文章时写了这篇文章。请参阅this answer,其中说明LIKE
和SIMILAR TO
可以使用适当创建的索引作为您正在进行的前缀匹配,但~
则不能。
尝试使用CREATE INDEX atable_junk_txt_idx ON aTable(junk text_pattern_ops)
创建类似LIKE 'foo b%'
的索引。
请注意,每个额外的索引都会减慢每次插入,更新和删除的速度,因此不要创建您不需要的索引。
请参阅Pg wiki上的Using explain。