这有效:
SELECT * FROM aTable WHERE junk='foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo b.*';
有什么问题?
编辑:是否有提交 sql 查询但没有给出答复的情况?例如无限循环、错误的语法等。
这有效:
SELECT * FROM aTable WHERE junk='foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo bar';
这永远挂起:
SELECT * FROM aTable WHERE junk~'foo b.*';
有什么问题?
编辑:是否有提交 sql 查询但没有给出答复的情况?例如无限循环、错误的语法等。
这三个都是正确的,但是如果您检查查询计划,EXPLAIN
您会发现计划非常不同。
请参阅此 SQLFiddle - 注意不同的执行时间。使用“查看执行计划”检查查询计划。
在您的情况下,这=
可能是对单个值使用 b-tree 索引查找,这应该非常快,而~
版本可能正在执行顺序扫描 - 并且非常耗费 CPU,因为它必须尝试正则表达式针对每一行。
我刚刚写了这篇文章来回答另一篇文章。请参阅此答案,该答案解释了这一点,LIKE
并且SIMILAR TO
可以像您正在做的那样使用适当创建的索引进行前缀匹配,但~
不能。
尝试创建一个索引,CREATE INDEX atable_junk_txt_idx ON aTable(junk text_pattern_ops)
然后使用LIKE 'foo b%'
.
请注意,每个额外的索引都会减慢每次插入、更新和删除的速度,因此不要创建不必要的索引。
请参阅Pg wiki 上的使用说明。
没有任何错误。
您的 2 个使用正则表达式的查询都不能使用索引进行优化。
所以你有完整的扫描结果,因此需要一些时间。