如何跟踪SQL更新的进度?

Mat*_*att 7 sql sql-server tracking progress

假设我有一个更新,例如:

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

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

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

谢谢

这是sql server 2008

Ric*_*iwi 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 '%:'
Run Code Online (Sandbox Code Playgroud)

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

select rows, rowmodctr
from sysindexes with (nolock)
where id = object_id('testtbl')
Run Code Online (Sandbox Code Playgroud)

itself在更新时,请不要在桌面上运行(nolock)计数查询.

  • 对你的上一句话感到好奇.在正在更新的表上运行(nolock)计数查询有什么危害? (2认同)

OMG*_*ies 0

数据库查询,特别是数据操作语言(DML),是原子的。这意味着插入/更新/删除要么成功发生,要么不成功。没有办法查看正在处理哪些记录——对于数据库来说,一旦在 UPDATE 后发出 COMMIT,它们都已更改。即使您能够查看正在处理的记录,当您看到该值时,查询也将继续处理其他记录。

了解流程中哪个位置的唯一方法是将查询编写为在循环内发生的脚本,因此您可以使用计数器来了解处理了多少个查询。这样做很常见,因此定期提交大型数据集,以最大限度地降低需要重新运行整个查询的失败风险。

  • -1 错误地陈述“没有办法”并提供不正确的解释。“几分钟之内,我的答案就被否决了”(是的,就是你)。 (2认同)