SQL ускорит производительность вставки?

Я выполняю некоторые тесты на сервере sql, и я хочу получить максимальную скорость вставки. Утверждение, которое я использую, выглядит примерно так:

INSERT INTO db_Test_databse..tbl_test with(rowlock)  
   (  joinid, date_key,   
      col1, col2,col3,col4, col5, col6, col7, col8, col9, col10,  ...     
   )  

SELECT  tabid as joinid, 
        date_key,
        rec_type,  
        col2,  
        dbo.udf_convert_hex_to_dec(col3),  
        col4, col5, col6, col7, col8,  
        dbo.udf_convert_hex_to_dec(col9),  
        dbo.udf_convert_hex_to_dec(col10),  
        ...
from source_table f

Есть 25 столбцов; большинство из них имеют тип bigint или int.

Я сбросил все индексы из таблицы назначения, кроме первичного ключа, который является полем идентификации.

Какие-нибудь советы о том, как улучшить производительность?

P.s. В этой форме я имею среднюю скорость 16.000 строк/сек.

Ответ 1

Чтобы получить максимальную производительность наилучшего, вы должны:

  • Удалите все триггеры и ограничения в таблице
  • Удалите все индексы, за исключением тех, которые необходимы вставки
  • Убедитесь, что ваш кластеризованный индекс таков, что новые записи всегда будут вставлены в конце таблицы (столбец с идентификатором будет просто отлично). Это предотвращает разбиение страниц (где SQL Server должен перемещать данные, поскольку существующая страница заполнена)
  • Задайте коэффициент заполнения до 0 или 100 (они эквивалентны), чтобы в таблице не осталось места, что уменьшило количество страниц, на которые распространяются данные.
  • Измените модель восстановления базы данных на Simple, уменьшив накладные расходы для журнала транзакций.

Являются ли несколько клиентов параллельными вставками записей? Если это так, тогда вы также должны ослабить блокирующие последствия.

Обратите внимание, что SQL Server может предлагать индексы для заданного запроса путем выполнения запроса в SQL Server Management Studio или через Советник по настройке ядра базы данных. Вы должны сделать это, чтобы убедиться, что вы не удалили индекс, который SQL Server использовал для ускорения INSERT.

Если это еще не достаточно быстро, вам следует рассмотреть возможность группировки вставок вместо BULK INSERT (или что-то вроде bcp utility или SqlBulkCopy, оба из которых используют BULK INSERT под обложками). Это даст максимальную пропускную способность при вставке строк.

Также см. Оптимизация производительности массового импорта - большая часть рекомендаций в этой статье также относится к "нормальным" вставкам.

Ответ 2

Считаете ли вы использование SqlBulkCopy? Вам нужно построить DataTable и передать его в процедуру WriteToServer.

Это БЫСТРО!

Ответ 3

вы можете использовать в своей процедуре магазина до конца

 OPTION(RECOMPILE)