【发布时间】:2015-10-12 03:48:23
【问题描述】:
您好,考虑在表 TABLE_A 上运行 INSERT 语句,这需要很长时间,我想看看它进展如何。
我尝试的是打开一个新会话(SSMS 中的新查询窗口),而长时间运行的语句仍在处理中,我运行了查询
SELECT COUNT(1) FROM TABLE_A WITH (nolock)
希望我每次运行查询时它会立即返回行数,但测试结果是偶数(nolock),但它只在INSERT语句完成后返回。
我错过了什么?我是否也将 (nolock) 添加到 INSERT 语句中?或者这是无法实现的?
(编辑) 好的,我找到了我错过的东西。如果您首先使用 CREATE TABLE TABLE_A,然后 INSERT INTO TABLE_A,则 SELECT COUNT 将起作用。如果您使用 SELECT * INTO TABLE_A FROM xxx,而没有先创建 TABLE_A,则以下任何一项都不会起作用(甚至 sysindexes 也不行)。
【问题讨论】:
-
单个 INSERT 是一个原子语句。它要么插入了所有行,要么没有插入。交易中间没有可用的计数。
-
我对 With (Nolock) 的了解是,它返回为 DML 语句锁定表之前拍摄的快照。所以在 DML 完成之前,它不会返回最新的结果。
-
@AshimDas 这无助于逐步计算已插入的行数。
-
永远不要在插入时使用 NOLOCK。这是 sql server 中非常绝对的事情之一。在插入、更新或删除时使用 NOLOCK 是任何时候都行不通的,这确实没有例外。它可能会破坏您的索引并导致各种问题。
-
insert的上下文是什么?它是否包含在transaction中和/或来自select?因为下面有证据表明一个人可以从某些正在进行的inserts 中获得部分count。
标签: sql sql-server sql-server-2012