0

我应该对几列的 2 个表进行几次更新。表都是大约 100 万行。我必须在 3 台不同的服务器上进行更改。更新很简单,只需删除一个子字符串。子字符串大约 200 个字符长,列是VARCHAR(MAX). 更改将影响大约三分之一的行。这是查询:

DECLARE @myVar varchar(250) = 'blablabla2345f25wdf34gqefblablabla...blablablabla'
UPDATE myTable
    SET myCol = REPLACE(myCol, @myVar, '')
WHERE myCol LIKE '%' + @myVar + '%'

问题是我从一张桌子开始并且需要很长时间才能执行,我在 10 分钟后停止了执行。第一个服务器只是测试/沙盒服务器,但其他服务器是预生产和生产。关于如何加快查询的任何建议?

4

2 回答 2

3

它缓慢的原因是因为您的 WHERE 语句没有命中任何索引。当字符串以通配符开头时,就像不能使用索引一样。根据服务器,如果您的搜索词是“someterm%”,您可能可以使用索引

有什么方法可以修复您的查询,以便有一个索引供它查找?

于 2013-11-14T15:54:23.460 回答
2

三个原因(至少):

  1. 您正在过滤未索引的列表达式,因此需要进行表扫描
  2. 您正在搜索 VARCHAR(MAX) 列,该列可能存储在与主表数据不同的页面中,因此需要额外的 I/O(加上字符串比较的额外开销)
  3. 您正在修改VARCHAR(MAX) 数据,因此可能需要重新组织数据以适应新空间,从而导致额外的 I/O。

除非您可以过滤其他字段,否则我想不出一种加快速度的方法。分批运行它会减少事务日志开销,并会显示增量进度,至少感觉它运行得更快。

于 2013-11-14T15:59:59.417 回答