此查询
UPDATE table
SET stringcol = REPLACE(stringcol, 'tester1', 'tester2')
WHERE stringcol LIKE '%tester1%'
的运行速度几乎是这个的两倍(在大桌子上)
UPDATE table
SET stringcol = REPLACE(stringcol, 'tester1', 'tester2')
其中仅省略了WHERE
子句。
我认为这是一个非常奇怪的结果。
在第一个查询中,数据库必须首先搜索表中的每个stringcol
,以查找tester1
的出现次数。然后,表的简化子集将传递给REPLACE
函数,该函数需要再次查找tester1
才能替换它。
在第二个查询中,数据库引擎必须搜索表中的每个stringcol
,发现tester1
,并相应地替换。
如果有的话,我希望第一个查询运行得更慢,因为WHERE
子句和REPLACE
函数都会检查tester1
的出现次数。
我想我对数据库如何处理查询的分析太简单了。有人可以解释性能上的差异吗?
答案 0 :(得分:1)
没有WHERE
子句的查询将替换应用于表中的每个行。这意味着对于每个记录,您将锁定磁盘区域,其中为该行存储stringcol
并获取内容,执行替换并将其写回。根据数据库的不同,即使数据没有变化,也可能会出现这种情况。这可能很聪明,因为可能需要更长的时间来验证是否存在更改而不是将其写入磁盘。此外,由于单个语句正在更新每个记录,因此DB将为每个更改创建一个事务日志。
添加WHERE
子句至少会在进行更改之前过滤每一行。即使LIKE '%value%'
不使用索引,DB也会在获取锁定并更新值之前检查字段的值。这可能会导致锁定的行数和应用的更改量大幅减少。