首页 > 解决方案 > 使用 SqlBulkCopy 插入的数据在数据库中占用的空间比使用 INSERT 语句多 9 到 92 倍

问题描述

我有一个 .NET Core 2.0 控制台应用程序将数据插入到 SQL Server 2017 (14.0.1000.169) 表中。它以前使用简单的INSERT语句。我将其更改为 use SqlBulkCopy,但发现它很快就开始耗尽数据库中的空间!测量数据插入前后使用的空间EXEC sp_spaceused显示每个插入的行平均占用:

在每种情况下都插入相同的数据。无论恢复模式设置为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 字节/行。

标签: .netsql-serverbulkinsertsqlbulkcopy

解决方案


推荐阅读