gpt4 book ai didi

sql-server - SQL 服务器立即返回结果

转载 作者:行者123 更新时间:2023-12-01 06:07:49 24 4
gpt4 key购买 nike

昨天,我在使用 SQL Server Management Studio 将补丁应用于多个数据库时遇到了这种奇怪的(以前从未见过的)情况。我需要在多个数据库上更新一个大表(500 万条记录+)。我为每个数据库发布的声明是这样的:

set rowcount 100000
select 1
while @@rowcount > 1
update table
set column = newval
where column is null

这些语句运行了几秒钟(2 到 30 秒之间的任何时间)。在第二个选项卡上,我运行了这个查询:
  select count(*) 
from table
where column is null

只是为了检查已经处理了多少行。我很不耐烦,我每 20 秒左右按 F5 键进行 count(*) 语句。并且 - 预期的行为 - 在计算 count(*) 之前,我必须等待 0 到 30 秒范围内的任何内容。我期待这种行为,因为更新语句正在运行,所以 count(*) 是下一个。

但是后来一个数据库还是10个之后这个奇怪的事情发生了。我打开了下一个数据库(通过 USE 更改了数据库),按 F5 后,count(*) 立即响应。再按F5后,直接结果但没有任何进展,一次又一次,计数(*)没有改变。但是更新正在运行。

然后在第 n 次按下后,count(*) 下降了 100K 条记录。我再次按下 F5,立即得到结果……等等等等……为什么?是不是 count(*) 在等待...我不允许阅读脏或....

只有这个数据库给了我这种行为。我真的不知道是什么导致了这种情况。

在切换数据库之间我没有关闭或打开任何其他选项卡,所以我唯一能想象的是那个数据库的连接参数是不同的。但是我忽略了那些......但我找不到区别。

最佳答案

根据我从上面的描述中了解到的是,您没有在某些特定数据库上正确获得 count() 的结果。如果是这种情况,请使用以下脚本而不是您的 count()

SELECT
COUNT(1)
FROM Table WITH(NOLOCK)
WHERE Column IS NULL

因为 count(*) 需要更多的时间来执行。并且因为您的要求是只知道计数使用 Count(1) 代替

如果您使用事务,也有可能锁定数据库。所以使用 WITH(NOLOCK) 来避免这种阻塞并更快地获得结果。

关于sql-server - SQL 服务器立即返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com