2012-11-24 77 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