批量插入期间 SQL Server 表锁

2024-04-26

下面是示例查询,考虑 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. 结果就绪后,开始向表中插入数据,同时对表应用锁。

那么,当实际数据写入页表时,即使使用 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(使用前将#替换为@)

批量插入期间 SQL Server 表锁 的相关文章

  • LINQ Group By 投影成非匿名类型?

    我有以下 LINQ 示例 var colorDistribution from product in ctx Products group product by product Color into productColors select
  • 如何在 WHERE 子句中最佳地使用 COALESCE() ?

    这是我的查询 select coalesce qa2 subject qa subject as question subject qa body select count from viewed items vi where coales
  • 在SQL Server中,not(columnName='value')和columnName<>'value'之间有什么区别吗?

    在 SQL Server 的 where 子句中 无论您编写代码有什么区别not columnName value or columnName lt gt value 我正在考虑性能方面的问题 有人告诉我 当使用 Not 时 它可能不会使用
  • SQL 与 LINQ 性能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • sql 查询查找匹配属性

    我目前正在做一个类似易货系统的系统 情况是这样的 客户 Jasmine 要求输入 NAME 属性 她需要寻找的内容 并输入 SEEK 属性 她需要寻找的内容 为了获得结果 SEEK 属性必须与其他客户的 Name 属性匹配 其他客户的 SE
  • Python,将CSV文件转换为SQL表

    我有一个没有标题的 CSV 文件 并尝试从文件中的某些列创建 SQL 表 我尝试了这里给出的解决方案 使用 Python 将 CSV 文件导入 sqlite3 数据库表 https stackoverflow com questions 2
  • Sequel Pro / MAMP 在哪里存储本地数据库?

    我通过 Sequel Pro 和 MAMP 在我的计算机上创建了一些数据库 并运行 localhost 来查看它们 但是 我全新安装了 Mac OS Lion 但忘记将数据库备份到 sql 文件 我会定期备份文件 并预装计算机的副本 有谁知
  • 选择返回动态列

    我有两个表 标准和服务产品 一个标准可以有多个服务产品 每个标准可以有不同数量的与其关联的服务产品 我需要做的是编写一个视图 该视图将返回一些常见数据 然后在一行上列出服务产品 例如 Standard Id Description SO 1
  • 连接2个表区分大小写

    我有 2 个表 需要获取品牌代码的结果 例如 在数据库中 我有两个不同的品牌 但它们的代码是相同的 只有小写和大写不同 例如 代码名称 关于耐克 和阿迪达斯 如何在代码上内连接 2 个表以分别获取这 2 个表 现在 在内连接之后我得到了这
  • Postgres 在转换时函数错误/失败时返回空值

    我正在尝试转换text价值观timestamp价值观 对于下表称为a id c1 1 03 03 2000 2 01 01 2000 3 12 4 1990 4 12 Sept 2011 5 12 1 1999 12 33 12 6 24
  • 在 CASE 语句中使用 CAST 时出现数据转换错误

    运行以下命令时出现错误 将数据类型 nvarchar 转换为 float 时出错 declare completeCommand nvarchar max x paramVal nvarchar 100 paramName nvarchar
  • 在 postgres 中选择时保留顺序[重复]

    这个问题在这里已经有答案了 在 psql 中 至少在 v9 中 如果我这样做 select id from users where id in 2 1 1 and select id from users where id in 1 2 它
  • 如何判断谁登录了 SQL Server

    我正在设计一个应用程序 我正在寻找最好的方法来告诉谁当前登录到 SQL Server 我将使用 SSMS 内置的活动监视器 它显示访问服务器的所有进程的列表 非常酷 但是 如果在我的 NET 代码中 每次访问数据库时它都使用单独的连接 那么
  • 在 SQL 中,如何获取特定列中具有最大值的行?

    我有一个疑问 SELECT COUNT as votes a member id FROM ballots a WHERE ballot id 1 GROUP BY a member id 这会产生类似的结果 votes member id
  • 将一行字段设置为其他 2 个字段的乘积

    我有一个这样的SQL表结构 Id A B C D 1 1 5 6 25 2 2 10 5 25 3 3 7 4 25 4 1 6 5 26 5 2 10 5 26 6 3 8 3 26 我想写一个脚本 它将更新所有B 和 C 列在行中A 3
  • CSV 数据中的逗号

    我有一个 CSV 文件 我将其直接导入到 SQL Server 表中 在 CSV 文件中 每一列都用逗号分隔 但我的问题是我有一个 地址 列 并且该列中的数据包含逗号 所以发生的情况是 地址列的一些数据将转到其他列 并将导入到 SQL Se
  • SQL 层次结构 - 解析给定节点的所有祖先的完整路径

    我有一个由邻接列表描述的层次结构 不一定有单个根元素 但我确实有数据来识别层次结构中的叶 终端 项 所以 一个看起来像这样的层次结构 1 2 4 7 3 5 6 8 9 将通过表格来描述 就像这样 NOTE 我没有能力改变这种格式 id p
  • 制作 SQL Server 转储并将该转储导入另一个 SQL Server 的最佳(最简单)方法

    我想从一台服务器在 SQL Server 中实现数据库导出 转储 并将该转储导入到另一台 SQL Server 中 并且不一定使用相同的架构名称 例如 如果我准备了一个数据库 其中包含用于为新客户实施新数据库的所有数据集 则该数据库名为 D
  • 通过 SQL 中的查询显示组中的非聚合列

    我在 SQL 2008 中有一个表 ID Items 1 A 1 B 2 C 3 D 3 B 我想得到的结果是 ID Items 1 A B 2 C 3 B D 我使用了游标 但它大大减慢了过程 我可以使用按查询分组或通过任何其他方式实现上
  • 将文件存储在文件系统上或在 SQL Server 中存储为 varbinary(MAX)

    我知道 对于将文件作为 blob 存储在数据库中是否是不好的做法存在很多争议 但我只是想了解这对于我的情况是否有意义 我正在创建一个 ASP NET 应用程序 在一家大公司内部使用 用户需要能够将文件附加到系统中的 作业 这些文件通常是 P

随机推荐