从 SELECT INTO #TempTable 锁定数据库

Kei*_*ith 3 sql-server

我们的实时数据库存在问题,其中从测试实例执行的查询引用了实时实例导致块,因为它显示为“暂停”,这导致用户请求备份,所有这些都是由于这个查询。

查看查询,一开始有一个请求引用了实时数据库:

SELECT      [Columns]
INTO        #TempTable
FROM        [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Users                      AS  sv
RIGHT JOIN  [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Company                    AS  co
INNER JOIN  [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Company_Marketing          AS  cm  ON co.co_ref        = cm.cmk_co_ref
INNER JOIN  [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Property                   AS  pr  ON co.co_pr_ref     = pr.pr_ref 
LEFT JOIN   [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Company_Types              AS  ct  ON co.co_cot_id     = ct.cot_id
LEFT JOIN   [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Users                      AS  cb  ON cm.cmk_called_by = cb.us_id 
LEFT JOIN   [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].Marketing_Disciplines      AS  md  ON cm.cmk_mdi_id    = md.mdi_id 
LEFT JOIN   [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].REGIONS                    AS  rg  ON sv.us_reg_id     = rg.reg_id
LEFT JOIN   [LIVESERVER\LIVEINSTANCE].[LIVEDB].[dbo].REGIONS                    AS  rg1 ON CB.us_reg_id     = rg1.reg_id
WHERE       cm.cmk_appointment > '2017-01-01'
AND         md.mdi_mdg_id <> 2
ORDER BY    cm.cmk_appointment
Run Code Online (Sandbox Code Playgroud)

这是针对测试实例运行的,但引用了实时(有一个链接服务器)。将其更改为在正确的实时实例上运行意味着它会在几秒钟内运行,并且不会出现阻塞问题。

我们正在整理查询,因为无论如何它都远非有效,但是,我想了解的是,SELECT INTO 在块/锁方面的表现如何?上面的查询是否意味着在填充#TempTable 时查询中的表上存在块?

谢谢你的协助。

Dan*_*man 5

我希望无论有没有INTO. 远程查询以默认的 READ COMMITTED 隔离级别行为运行,在执行期间获取和释放共享锁,就像本地查询一样。这些锁可能会阻塞远程表的编写者,尤其是在查询编写不当以及在查询期间持有共享表级锁的情况下。

另外,本地 SELECT INTO 查询在自动提交模式下运行时由两个单独的事务组成。这样做是为了避免长期锁定系统目录对象,否则可能会阻止其他会话创建对象。新表的创建在第一个事务中完成,然后在第二个事务中使用远程查询源加载该表。