1

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

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

4

2 回答 2

2

这三个都是正确的,但是如果您检查查询计划,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 上的使用说明。

于 2012-09-17T03:09:37.557 回答
2

没有任何错误。

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

所以你有完整的扫描结果,因此需要一些时间。

于 2012-09-17T02:56:51.197 回答