2012-09-17 19 views
1

這工作:
SELECT * FROM aTable WHERE junk='foo bar';
此掛起,直到永遠。
SELECT * FROM aTable WHERE junk~'foo bar';
此掛起,直到永遠。
SELECT * FROM aTable WHERE junk~'foo b.*';
有什麼不對?我正在數據庫上正常使用正則表達式嗎?

編輯:是否曾經有過一個情況,在哪裏提交的sql查詢,但沒有回覆是有史以來給出?例如無限循環,錯誤語法等。

+2

語法錯誤會立即產生錯誤的回覆。儘管如此,不可能返回的查詢當然也是可能的,例如錯誤地寫入遞歸CTE('WITH RECURSIVE'查詢)。當系統資源耗盡時,大多數錯誤的查詢最終會失敗,但可以編寫永久運行的查詢。在由空閒事務保存的鎖上阻塞的查詢將無限期地掛起(或直到空閒事務終止)。順便說一句,你是否按照我的建議檢查了每個陳述的「解釋」輸出,以便你能看到發生了什麼?值得做。 –

+0

如果您正在尋找左錨定搜索字詞,請務必表達它。將*更快*:'垃圾〜'^ foo bar'',並且可以通過索引來支持。一般情況下,如果可以的話,使用'LIKE'。更快,但。更多根據這[關於dba.SE的相關問題](http://dba.stackexchange.com/q/10694/3684) –

回答

2

沒有什麼錯。

您的兩個使用正則表達式的查詢都不能使用索引進行優化。

因此,您已經完全掃描結果,因此需要一些時間。

2

這三個都是正確的,但如果您使用EXPLAIN檢查查詢計劃,則會看到計劃有很大不同。

請參閱this SQLFiddle - 注意不同的執行時間。用「查看執行計劃」檢查查詢計劃。

在你的情況下,=則可能使用B-tree索引查找單個值,這應該是非常快的,而~版本可能做順序掃描 - 而且是相當的CPU昂貴的,因爲它必須針對每一行嘗試正則表達式。

我剛剛在另一篇文章中回答了這個問題。請參閱this answer,其中解釋LIKESIMILAR TO可以像使用適當創建的索引一樣匹配前綴匹配項,但~不能。

嘗試創建一個索引,如CREATE INDEX atable_junk_txt_idx ON aTable(junk text_pattern_ops),然後使用LIKE 'foo b%'

請注意,每個額外的索引都會減慢每個插入,更新和刪除操作,因此不要創建不必要的索引。在Pg維基上查看Using explain

相關問題