sql-server - TABLOCK 是否会提高 BULK INSERT 的性能?
问题描述
我只是想知道 TABLOCK 是否会提高 BULK INSERT 的性能?
根据https://dba.stackexchange.com/questions/165966/how-does-one-investigate-the-performance-of-a-bulk-insert-statement中的第一个答案,TABLOCK 似乎会。
根据https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-ver15的官方文档,它说“一张表可以如果表没有索引并且指定了 TABLOCK,则由多个客户端同时加载。" 但就我而言,只有一个会话需要将数据批量插入数据库,所以我似乎根本不需要指定 TABLOCK。
我在https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a957cd37-ec96-4beb-8a4b-03d783c7f91e/whether-tablock-will-improve-the-performance-of-上问过这个问题bulk-insert-or-not?forum=transactsql但没有得到满意的答案,所以我不得不在这里重新发布问题。
谢谢
解决方案
TABLOCK 指定在大容量导入操作期间获取表级锁。如果表没有索引并且指定了 TABLOCK,则可以由多个客户端同时加载表。默认情况下,锁定行为由表选项 table lock on bulk load 确定。在大容量导入操作期间持有锁可减少表上的锁争用,在某些情况下可以显着提高性能。
如果您的数据插入到表中只有一个会话表锁对您没有任何好处,但是当许多会话可以将数据插入到您的表中时,表锁可以减少您进程中的锁争用。但是当您的表有表锁定时,另一个会话无法访问表。
推荐阅读
- r - 拆分一列并粘贴到 R 中的原始表
- bluetooth - 蓝牙广播 - 主机名 vs 友好名称 vs 别名
- r - 使用 tslm() 和 tidyverse 预测时间序列组
- node.js - 使用 Electron 访问 macOS 照片库
- python - 调用者执行完后如何在python函数中执行一段代码?
- google-sheets - 根据 Google 表格中的 2 个条件对产品应用折扣
- java - 尝试使用 for 循环找出素数,但我的代码不起作用,为什么?
- linux - shell形式的docker入口点可以使用运行时命令args吗?
- database - Go 中的继承使用或仅处理多种用户类型
- kubernetes - 当服务已经存在时,如何使用 Kubernetes 创建身份验证?