我们的实时数据库存在问题,其中从测试实例执行的查询引用了实时实例导致块,因为它显示为“暂停”,这导致用户请求备份,所有这些都是由于这个查询。
查看查询,一开始有一个请求引用了实时数据库:
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 时查询中的表上存在块?
谢谢你的协助。
我希望无论有没有INTO
. 远程查询以默认的 READ COMMITTED 隔离级别行为运行,在执行期间获取和释放共享锁,就像本地查询一样。这些锁可能会阻塞远程表的编写者,尤其是在查询编写不当以及在查询期间持有共享表级锁的情况下。
另外,本地 SELECT INTO 查询在自动提交模式下运行时由两个单独的事务组成。这样做是为了避免长期锁定系统目录对象,否则可能会阻止其他会话创建对象。新表的创建在第一个事务中完成,然后在第二个事务中使用远程查询源加载该表。