.net - 使用 SqlBulkCopy 插入的数据在数据库中占用的空间比使用 INSERT 语句多 9 到 92 倍
问题描述
我有一个 .NET Core 2.0 控制台应用程序将数据插入到 SQL Server 2017 (14.0.1000.169) 表中。它以前使用简单的INSERT
语句。我将其更改为 use SqlBulkCopy
,但发现它很快就开始耗尽数据库中的空间!测量数据插入前后使用的空间EXEC sp_spaceused
显示每个插入的行平均占用:
- 28 字节/行
INSERT
(这听起来很正确) - 具有默认选项的批量复制 256 字节/行
- 带 TableLock 选项的大容量复制为 2585 字节/行
在每种情况下都插入相同的数据。无论恢复模式设置为Simple还是Bulk-logged都会发生这种情况。
插入代码很简单:
using (var transaction = _connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
DataTable dt = CreateDataTable();
var bulkCopy = new SqlBulkCopy(_connection, SqlBulkCopyOptions.TableLock, transaction) {DestinationTableName = $"[MyTable]"};
bulkCopy.WriteToServer(dt);
transaction.Commit();
}
表定义如下所示:
CREATE TABLE [MyTable]
(
A [datetime] NOT NULL,
B [int] NOT NULL,
C [varchar](max) NOT NULL,
D [varbinary](max) NULL,
E [varchar](250) NULL,
F [int] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
这里发生了什么?如何在不占用大量空间的情况下快速插入?
编辑:我尝试使用跟踪标志 692,然后使用 TableLock 使用 1767 字节/行,使用默认选项使用 45 字节/行。
解决方案
推荐阅读
- android - setText() inside Fragment inside FrameLayout
- api - 与 MS Graph 和 asp.net Core API 斗争
- r - 如何计算 R 中使用两个栅格堆栈的每个组的最大值?
- tsql - 是否可以检查链接服务器上是否存在 tmp 表?
- flutter - 在customScrollView中滚动到底部时如何检测并运行加载功能
- artifactory - 限制 Jfrog Artifactory 中的快照数量
- ruby - 使用检测 rfid 的外围设备在 Ruby 中创建一个循环
- azure - 重新实现 uniqueString() 哈希 ARM 函数
- java - 每年管理 Java 密钥库更改
- flutter - 如何在 Flutter 应用上设置支付服务