下面是示例查询,考虑 A
INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1
Select A.Col1,B.Col2,A.Col3,C.Col4 ----------------Statement#2
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK)
ON A.Id = B.ID
LEFT JOIN C WITH NOLOCK
ON C.Id = B.ID
Where A.Id = 11
在哪个阶段会对表加锁[排它锁?],SQL将如何执行查询?
- 将根据 join 和 where 子句从表 A、B 和 C 中获取结果。
- 结果就绪后,开始向表中插入数据,同时对表应用锁。
那么,当实际数据写入页表时,即使使用 SELECT 进行 INSERT INTO,页表也会被锁定,但在 select 期间不会被锁定?
这两个步骤是查询执行的逻辑步骤。 SQL Server 在物理层面可以做什么/做什么是另一个故事。此时此刻:
INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1
Select A.Col1,B.Col2,A.Col3,C.Col4 ----------------Statement#2
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK)
ON A.Id = B.ID
LEFT JOIN C WITH NOLOCK
ON C.Id = B.ID
Where A.Id = 11
对于每个输出记录(参见SELECT
子句)需要一个X lock
on a RID
or a KEY
在目标表内(RID
对于堆/KEY
对于聚集索引)并插入该记录。对每个输出记录重复此步骤。因此,它不会从源表中读取所有记录,只有在这一步之后,它才开始将记录插入到目标表中。因为NOLOCK
源表上的表提示只会在这些表上使用 Sch-S(架构稳定性)锁。
如果你想在目标表上使用 X 锁,那么你可以使用
INSERT INTO Target WITH(TABLOCKX) (Col1,Col2,Col3,Col4)
SELECT ...
如果您想要最少记录的插入,请阅读此内容article http://sqlmag.com/t-sql/minimally-logged-inserts.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)