Производительность со вставкой строк изнутри хранимой процедуры CLR - PullRequest
0 голосов
/ 13 марта 2012

У меня есть SP, написанный на C #, который вычисляет около 2 миллионов строк. Расчет занимает около 3 минут. Для каждой строки результат генерируется в виде трех чисел. Эти результаты вставляются во временную таблицу, которая позже как-то обрабатывается. Результаты добавляются кусками, а вставка занимает иногда более 200 минут (да, более 3 часов!). Иногда это занимает «всего» 50 минут. Я изменил его так, что результаты сохраняются в памяти до конца, а затем целые 2 миллиона сбрасываются в один цикл внутри одной транзакции. Тем не менее - это занимает около 20 минут. Аналогичный цикл, написанный на SQL с транзакцией begin / commit, занимает менее 30 секунд. У кого-нибудь есть идея, в чем проблема? Обработка 2 миллионов (так что их выбор и т. Д.) Занимает 3 минуты, а результаты в лучшее решение - 20 минут. ОБНОВЛЕНИЕ: эта таблица имеет один кластеризованный индекс в столбце идентификаторов (чтобы гарантировать, что строки физически добавляются в конце), никаких триггеров, никаких других индексов, никакой другой процесс не обращается к нему.

1 Ответ

0 голосов
/ 13 марта 2012

Пока мы все расплывчаты, вот расплывчатый ответ.Если вставка 2-миллиметровых строк занимает столько времени, я бы проверил четыре проблемы в следующем порядке:

  1. Проверка ссылок на внешние ключи или ограничений уникальности.Вам не нужно ничего из этого на вашем временном столе.Выполните проверку в CLR, прежде чем запись попадет на шаг вставки.
  2. Сложные триггеры.Пожалуйста, скажите мне, что у вас нет никаких триггеров на временной таблице.Закончите вставки, а затем выполните дополнительную обработку после того, как все будет.
  3. Попытка пересчитать индексы после каждой вставки.Попробуйте сбросить индексы до шага вставки и создать заново после.
  4. Если это не так, возможно, вы имеете дело с блокировкой записи.Есть ли у вас другие процессы, которые попадают во временную таблицу, которая может мешать?Можете ли вы остановить их во время вставки?
...