Postgres 正则表达式替换性能

Pau*_*ulb 5 regex sql postgresql

我有一个 Postgres 性能问题。我有一个包含大约 500K 行文本的表格。我需要进行一些全局搜索和替换例程。这两个 UPDATE 语句之一会比另一个更快吗?或者它们的性能非常相似?

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

update mytable
set mycolumn = regexp_replace(mycolumn, 'ReplaceMe','WithMe', 'g')
where mycolumn like '%ReplaceMe%';
Run Code Online (Sandbox Code Playgroud)

Pea*_*oto 5

一般来说,如果您包含一个 where 语句来限制 SQL 查询,那么 SQL 查询总是会更快。所以第二个肯定应该更快。本质上,数据库能够非常快速地执行此类操作。第一个首先获取整个列表,然后通过正则表达式语句检查它。后者只需在缩短的列表上执行正则表达式即可。

然而,正如a_horse_with_no_name 指出的那样,除非有一个与 关联的索引%ReplaceMe%,否则查询不会更快。但是,它仍然应该稍微快一些,因为通过 regex 命令处理的项目较少。

  • 按照其编写方式,where 语句不会减少“查找”行所需的时间。Postgres 很可能会读取整个表,因为表达式“like '%ReplaceMe%”不会使用索引(除非 trgm 索引可用)。然而,第二个将更新更少的行,因此可能会更快。 (3认同)
  • 谢谢。我明白你的观点。我认为我的情况的关键是更新——没有 WHERE,我正在更新 500K 行,即使他们不需要它。对于 WHERE,我只更新将要更改的行(大约占总数的 3%,因此事先使用 WHERE 进行缩减会有所帮助)。 (3认同)