gpt4 book ai didi

批量插入期间的 SQL Server 表锁定

转载 作者:行者123 更新时间:2023-12-02 01:58:01 24 4
gpt4 key购买 nike

下面是示例查询,考虑 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将如何执行查询?

  1. 将根据join 和where 子句从表A、B 和C 中获取结果。
  2. 准备好结果后,开始向表中插入数据,同时对表应用锁。

所以当实际数据写入页表时,页表被锁定,但在选择期间没有锁定,即使它是 INSERT INTO with 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 子句),它在RIDKEY 上使用X 锁 > 在目标表中(RID 用于堆/KEY 用于聚集索引)并插入该记录。对每个输出记录重复此步骤。 因此,它不会从源表中读取所有记录,只有在这一步之后,它才会开始将记录插入到目标表中。由于源表上的 NOLOCK 表提示,它将需要只有 Sch-S(模式稳定性)锁定这些表。

如果你想对目标表进行 X 锁定,那么你可以使用

INSERT INTO Target WITH(TABLOCKX) (Col1,Col2,Col3,Col4)
SELECT ...

如果您想要最少的日志插入,请阅读此 article .

关于批量插入期间的 SQL Server 表锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779312/

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