SQL ускорит производительность вставки? - PullRequest
12 голосов
/ 17 августа 2011

Я выполняю некоторые тесты на сервере 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 строк / сек.

Ответы [ 3 ]

17 голосов
/ 17 августа 2011

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

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

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

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

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

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

1 голос
/ 25 августа 2015

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

 OPTION(RECOMPILE)
1 голос
/ 17 августа 2011

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

БЫСТРО!

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