Данные, вставленные с использованием SqlBulkCopy, занимают от 9 до 92 раз больше места в базе данных, чем операторы INSERT. - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть консольное приложение .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 байт / строку с параметрами по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...