如何跟踪SQL更新的进度?

时间:2011-01-21 01:17:03

标签: sql sql-server tracking progress

假设我有更新,例如:

  UPDATE [db1].[sc1].[tb1] 
  SET c1 = LEFT(c1, LEN(c1)-1) 
  WHERE c1 like '%:'

如果c1列中有一个,这个更新基本上会经历数百万行并修剪冒号。

如何跟踪表格的进展情况?

由于

这是sql server 2008

3 个答案:

答案 0 :(得分:22)

您可以使用sysindexes表来跟踪索引的更改量。因为这是在原子更新中完成的,所以它没有机会重新计算统计数据,因此rowmodctr将继续增长。这在小表中有时并不明显,但对于数百万,它会显示出来。

-- create a test table
create table testtbl (id bigint identity primary key clustered, nv nvarchar(max))

-- fill it up with dummy data. 1/3 will have a trailing ':'
insert testtbl
select
    convert(nvarchar(max), right(a.number*b.number+c.number,30)) + 
    case when a.number %3=1 then ':' else '' end
from master..spt_values a
inner join master..spt_values b on b.type='P'
inner join master..spt_values c on c.type='P'
where a.type='P' and a.number between 1 and 5
-- (20971520 row(s) affected)

update testtbl
set nv = left(nv, len(nv)-1)
where nv like '%:'

现在在另一个查询窗口中,连续运行以下内容并观察rowmodctr上升和上升。 rowmodctr vs rows让您了解自己应该在哪里,如果您知道rowmodctr最终需要在哪里。在我们的例子中,它是刚刚超过200万的67%。

select rows, rowmodctr
from sysindexes with (nolock)
where id = object_id('testtbl')

请勿在更新表itself时运行(nolock)计数查询。

答案 1 :(得分:1)

不是真的......你可以使用nolock提示进行查询,并在同一地方查询,但这会占用资源

当然,这不是带有前导通配符的最佳查询...)

答案 2 :(得分:-2)

数据库查询,尤其是数据操作语言(DML),是原子的。这意味着INSERT / UPDATE / DELETE成功发生,或者没有成功发生。无法查看正在处理的记录 - 在数据库中,一旦在UPDATE之后发出COMMIT,它们都已被更改。即使您能够查看正在处理的记录,当您看到该值时,查询也会进展到其他记录。

了解进程中脚本查询在循环中发生的唯一方法,这样您就可以使用计数器来了解处理的数量。这样做很常见,因此会定期提交大型数据集,以最大程度地降低因再次运行整个查询而导致失败的风险。