Sql 在何处使用LIKE进行缓慢更新

Sql 在何处使用LIKE进行缓慢更新,sql,tsql,sql-server-2008-r2,sql-update,Sql,Tsql,Sql Server 2008 R2,Sql Update,我应该在两列上的两个表上做一些更新。两个表都有大约100万行。我必须在3台不同的服务器上进行更改。更新很简单,只需删除一个子字符串。子字符串大约有200个字符长,列是VARCHAR(MAX)。更改将影响大约三分之一的行。以下是查询: DECLARE @myVar varchar(250) = 'blablabla2345f25wdf34gqefblablabla...blablablabla' UPDATE myTable SET myCol = REPLACE(myCol, @myVa

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

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

问题是,我从一个表开始,正在使用Looong执行,我在10分钟后停止了执行。第一个服务器只是测试/沙盒服务器,但其他服务器是预生产和生产服务器。有没有关于如何加快查询速度的建议?

查询速度慢的原因是WHERE语句没有命中任何索引。当字符串以通配符开头时,Like不能使用索引。根据服务器的不同,如果搜索词是“someterm%”,则可以使用索引


有什么方法可以修复查询,使其有一个索引可供查找吗?

查询速度慢的原因是WHERE语句没有命中任何索引。当字符串以通配符开头时,Like不能使用索引。根据服务器的不同,如果搜索词是“someterm%”,则可以使用索引

有什么方法可以修复查询,使其有一个可供查询的索引吗?

原因有三(至少):

  • 您正在筛选未索引的列表达式,因此需要进行表扫描
  • 您在VARCHAR(MAX)列中搜索,该列可能存储在与主表数据不同的页面中,因此需要额外的I/O(加上字符串比较的额外开销)
  • 您正在修改VARCHAR(MAX)数据,因此可能需要重新组织数据以适应新的空间,从而导致额外的I/O
  • 除非有额外的领域,你可以过滤,我想不出一个方法来加快它。分批运行它将减少事务日志开销,并向您显示增量进度,这至少让您感觉它运行得更快。

    三个原因(至少):

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

  • 除非有额外的领域,你可以过滤,我想不出一个方法来加快它。以批处理方式运行它将减少事务日志开销,并将显示增量进度,这至少感觉它会更快。

    考虑将您的更新批处理(例如,每条语句做10K更新,重复到完成)。考虑将您的更新批处理(例如,每条语句做10K更新,重复到完成)。.已经试过了。子字符串可以在文本中的任何地方找到。@Yaroslav在索引方面,你运气不好;(加快
    更新
    的一种方法是
    选择需要单独更新的行的ID,并在更新中直接使用这些ID,这总共不会为您节省任何时间。)course@DrCopyPaste,遗憾的是,我也尝试过,但没有任何改进。我几乎无法考虑修改查询以使用索引。而且,我可以在测试服务器上执行,但不能在其他2个服务器上执行,因为在那里我只能启动DML语句,无法添加/修改索引或类似操作。@Yaroslav Yea如果搜索以通配符开头的字符串,
    select
    将不使用任何索引;
    update
    但是,如果您需要,将使用id列上的索引将ID列表直接添加到更新查询中,最后使用了注释和答案的混合。拆分更新(按照gvee的建议进行批处理)在较小的块上,我意识到我可以通过语言进行过滤。同时,进行更仔细的搜索发现,在主字符串开头出现的子字符串中,有一半以上的子字符串修改了查询,以便更好地利用可用索引。我在速度上没有得到太多的改进,但通过这种方式,服务ers在很长一段时间内都没有过载,所以DBA没有超过我的负担。我已经尝试过了。子字符串可以在文本中的任何地方找到。@Yaroslav在索引方面,你当时运气不好;(加快
    更新
    的一种方法是
    选择需要单独更新的行的ID,并在更新中直接使用这些ID,这总共不会为您节省任何时间。)course@DrCopyPaste,遗憾的是,我也尝试过,但没有任何改进。我几乎无法考虑修改查询以使用索引。而且,我可以在测试服务器上执行,但不能在其他2个服务器上执行,因为在那里我只能启动DML语句,无法添加/修改索引或类似操作。@Yaroslav Yea如果搜索以通配符开头的字符串,
    select
    将不使用任何索引;
    update
    但是,如果您需要,将使用id列上的索引将ID列表直接添加到更新查询中,最后使用了注释和答案的混合。拆分更新(按照gvee的建议进行批处理)在较小的块上,我意识到我可以通过语言进行过滤。同时,进行更仔细的搜索发现,在主字符串开头出现的子字符串中,有一半以上的子字符串修改了查询,以便更好地利用可用索引。我在速度上没有得到太多的改进,但通过这种方式,服务ERS没有太长时间过载,所以DBA没有超过我的负担!没有考虑<代码> VARARAR(MAX)影响I/O开销。是的,批处理可以是在@ GVEEUCH的注释上建议的选项!没有考虑<代码> VARCHAR(MAX)影响I/O开销。