2017-01-21 16 views
0

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

Сохраненная процедура 2 вставляет около 20 тыс. Строк в таблицу для каждого значения из курсора.

Поскольку в курсоре содержится около 100 записей, общее количество вставленных строк составляет 200 КБ, что заставляет запрос работать в течение нескольких дней, пока он не будет остановлен в процессе производства.

Тот же запрос занимает около 8 минут в dev.

Я попытался использовать контейнер foreach в SSIS (dev), и это занимает 5 минут (dev).

Есть ли более быстрый способ вставки этих записей?

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

+0

Является ли количество данных одинаковым в производстве и dev? Если да, то почему он медленнее? –

+1

Вставка строк 200k, даже внутри курсора, не должна занимать несколько дней. –

+0

Вы свидетельствуете о той же производительности в производственной системе, даже когда существует почти нулевое использование системы? –

ответ

0

Dpending на том, что хранится процедура 2 делает, вероятно, стоит посмотреть на объемную вставку.

См: https://www.simple-talk.com/sql/learn-sql-server/bulk-inserts-via-tsql-in-sql-server/

Вы также можете просмотреть индексы и конфигурацию среды прода для обеспечения оптимальной производительности нагрузки. В приведенной выше ссылке есть некоторые рекомендации по улучшению производительности вставки.

Так что определенно стоит прочитать.