2012-11-24 111 views
3

我有一個Postgres性能問題。我有一個約500K行文本的表格。我需要做一些全球搜索和替換例程。這兩個UPDATE語句中的一個會比另一個更快嗎?或者他們的表現會非常相似?Postgres正則表達式替換性能

update mytable 
set mycolumn = regexp_replace(mycolumn, 'ReplaceMe','WithMe', 'g'); 

update mytable 
set mycolumn = regexp_replace(mycolumn, 'ReplaceMe','WithMe', 'g') 
where mycolumn like '%ReplaceMe%'; 

回答

3

通常,如果您包含一個where語句來限制它們,SQL查詢總是更快。所以第二個肯定會更快。本質上,數據庫能夠非常快速地完成這種操作。第一個首先獲取整個列表,然後通過regex語句進行檢查。後者只需要在縮寫列表中執行正則表達式。

正如a_horse_with_no_name指出的那樣,除非有與%ReplaceMe%相關的索引,否則查詢不會更快。它仍然應該稍微快一點,因爲通過regex命令處理的項目會更少。

+3

它的寫法是,where語句不會減少查找行的時間。 Postgres很可能會讀取整個表,因爲表達式'like'%ReplaceMe%''不會使用索引(除非有trgm索引可用)。第二個將更新更少的行,並可能更快。 –

+0

好的,我已經添加了。感謝您的信息! – PearsonArtPhoto

+3

謝謝。我明白你的觀點。我認爲我的情況的關鍵是更新 - 沒有WHERE,我正在更新500K行,即使他們不需要它。使用WHERE,我只更新將會改變的行(約佔總數的3%,因此減少WHERE之前的幫助)。 – Paulb