У меня есть консольное приложение .NET Core 2.0, вставляющее данные в таблицу SQL Server 2017 (14.0.1000.169). Ранее использовались простые INSERT
операторы. Я изменил его, чтобы использовать SqlBulkCopy
, но обнаружил, что он начал использовать пространство в БД очень быстро! Измерение пространства, использованного до и после вставки данных с использованием EXEC sp_spaceused
, показывает, что каждая вставленная строка занимает в среднем:
- 28 байт / строка для
INSERT
(звучит правее)
- 256 байт / строка для группового копирования с параметрами по умолчанию
- 2585 байт / строка для параметра «Массовое копирование с опцией TableLock»
В каждом случае вставляются одни и те же данные. Это происходит независимо от того, установлена ли модель восстановления на 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, а затем он использует 1767 байт / строку с TableLock, 45 байт / строку с параметрами по умолчанию.