当前位置: 首页 > 面试题库 >

是什么阻止“用(nolock)用TableName选出top 1 *”返回结果?

陆沈浪
2023-03-14
问题内容

我目前正在执行以下语句

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连接中拉出的视图。我认为这不会影响为什么我不能返回第一行,而只是把它扔出去以防万一我错了。

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

编辑:

如上所述,是的dps_san..savedi_record是一个视图。这是它的作用:

select * from DPS_SAN..root.SAVEDI_RECORD

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


问题答案:

SELECT具有的查询NOLOCK实际上并不需要任何锁,它们仍然需要SCH-S在表上具有(模式稳定)锁(并且由于它是堆,因此也需要hobt锁)。

另外,SELECTSQL 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


 类似资料:
  • 本文向大家介绍Math.min() < Math.max() 返回结果是什么?为什么?相关面试题,主要包含被问及Math.min() < Math.max() 返回结果是什么?为什么?时的应答技巧和注意事项,需要的朋友参考一下 返回,因为返回,返回。 猜测的实现方式大致如下: 接受不定项参数,当参数只有一个的时候,例如,那么这个需要和(js中最小的数)进行比较,所以结果返回,哪怕传入的值再小,单个

  • 我一直在尝试SpringAMQP。我有几个问题: 我想知道什么是Publisher退货,它与Publisher确认有什么不同。据我所知,我们有一个Publisher Confirm回调,用于检查ACK的状态。现在我看了Spring AMQP和Rabbit MQ中的文档。在这件事上我真的没有发现或理解太多。 还有为什么如果消息试图发送到一个不存在的队列,我不会得到任何类型的确认(ack/nack),

  • 问题内容: 在您应该/不应该使用查询时,有人可以解释使用查询的含义吗? 例如,如果您有一个银行业务应用程序,该应用程序具有高事务处理率,并且某些表中的数据很多,那么在哪种类型的查询中就可以了?在某些情况下,您应该始终使用它/从不使用它吗? 问题答案: WITH(NOLOCK)等同于使用READ UNCOMMITED作为事务隔离级别。因此,您将冒着读取未提交的行的风险,该行随后将被回滚,即从未进入数

  • 我显然误解了jspromise的解决方式或“返回”的语义 我被一个期望我是同步的函数调用——返回一个值。计算该值需要一些异步代码(特别是dstore集合上的ForEach方法) 我试图实现的大致是这个,但这不起作用,因为函数mySynchronousFunction没有返回值。 我知道JS必须允许单线程实现,所以阻止它并不酷,但必须有某种模式用于将异步代码粘合到同步代码,我刚刚错过了这种模式。

  • 我正在使用Spring Webflux和Spring Boot2,我的场景如下: 在返回之前,我如何将来自流量和正常产品列表的结果连接起来?没有反应控制器是可能的吗? 附言。我不想对从调用1获得的结果调用。block()和CompleteableFuture

  • 问题内容: 我有两个内联的div。它们都有相似的样式,重要的是它们都是内联的。 jQuery报告其CSS“显示”仅在chrome中受阻。我真的需要知道这两个是内联的。 CSS: 的HTML: jQuery: 有谁知道发生了什么,或更重要的是我该怎么办? (除了拉扯我的头发…开始受伤;) 问题答案: 正如我在评论中说的那样,力量。 元素生成一个浮动在左侧的 块框 。 然后: 否则,如果“ float