假设我有更新,例如:
UPDATE [db1].[sc1].[tb1]
SET c1 = LEFT(c1, LEN(c1)-1)
WHERE c1 like '%:'
如果c1列中有一个,这个更新基本上会经历数百万行并修剪冒号。
如何跟踪表格的进展情况?
由于
这是sql server 2008
答案 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,它们都已被更改。即使您能够查看正在处理的记录,当您看到该值时,查询也会进展到其他记录。
了解进程中脚本查询在循环中发生的唯一方法,这样您就可以使用计数器来了解处理的数量。这样做很常见,因此会定期提交大型数据集,以最大程度地降低因再次运行整个查询而导致失败的风险。