gpt4 book ai didi

sql - 是什么阻止 "Select top 1 * from TableName with (nolock)"返回结果?

转载 作者:行者123 更新时间:2023-12-04 03:12:43 25 4
gpt4 key购买 nike

我目前正在执行以下语句

select * into adhoc..san_savedi from dps_san..savedi_record

这花费了很长时间,我想看看它走了多远,所以我运行了它:
select count(*) from adhoc..san_savedi with (nolock)

那没有及时返回任何东西,所以对于它,我做到了:
select top 1 * from adhoc..san_savedi with (nolock)

即使这样似乎也无限期地运行。我可以理解是否有数百万条记录需要count(*)花费很长时间,但是我不明白为什么考虑到我指定了nolock,选择前1条记录为什么不会立即返回。

以完全公开的名义,dps_san是通过链接服务器从odbc连接中拉出的 View 。我认为这不会影响为什么我不能返回第一行,而只是把它扔出去以防万一我错了。

因此,我想知道是什么导致该语句无法运行?

编辑:

如上所述,是的dps_san..savedi_record是一个 View 。这是它的作用:
select * from DPS_SAN..root.SAVEDI_RECORD

它不过是一个别名而已,也不进行分组/排序/等操作,因此我认为问题不在于此,但是如果我错了,请告诉我。

最佳答案

带有SELECTNOLOCK查询实际上并没有获得任何锁,它们仍然需要在表(and as it is a heap it will also take a SCH-S lock)上加一个hobt(模式稳定)锁。

另外,在SELECT甚至不能开始之前,SQL Server就必须为该语句编译一个计划,这也要求它从表中取出SCH-S锁。

当您的长期事务通过SELECT ... INTO创建表时,它将在表上持有不兼容的SCH-M锁,直到语句完成。

您可以在屏蔽期间通过查看sys.dm_os_waiting_tasks来验证这一点。

当我在一种连接中尝试以下操作时

BEGIN TRAN

SELECT *
INTO NewT
FROM master..spt_values

/*Remember to rollback/commit this later*/

然后执行(或只是尝试查看估计的执行计划)
SELECT *
FROM NewT
WITH (NOLOCK)

一秒钟后,阅读查询被阻止。
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>

显示等待类型的确是 SCH_S和阻塞资源 SCH-M
wait_type        resource_description
---------------- -------------------------------------------------------------------------------------------------------------------------------
LCK_M_SCH_S objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722

关于sql - 是什么阻止 "Select top 1 * from TableName with (nolock)"返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10955752/

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