SlowRider
@SlowRider
Считает себя фулл-стек разработчиком;)

Чем заменить курсор при вставке данных в таблицу?

Добрый день.

На MS SQL Server есть табличка, в ней данные вида
ID Parent Value
1 1 2.7
2 1 2.8
3 2 3.2
4 2 3.2
5 2 3.3
6 3 4.1

Дочерних элементов каждого parent должно быть по три, то есть надо определить, где сколько не хватает, и столько забить средними значениями (добавить одну запись с Parent=1, у Parent=2 все норм, добавить две записи с Parent=3).

Как делается сейчас:
Выбираются родители и недостача
Parent Lost
1 1
2 0
3 2

Записи пробегаются курсором, внутри которого WHILE'ом нужное количество раз выполняется INSERT

Проблема в том, что в оригинальной табличке записей ~20 млн. и надо вставить тысячи недостающих, что выливается в непотребное время выполнения операции.

И, собственно, вопрос: чем заменить конструкцию CURSOR + WHILE?
Или заменить MSSQL на другое что?

Заранее спасибо!
  • Вопрос задан
  • 787 просмотров
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Ну в ряде случаев курсор может быть полезно заменить на while, а while на что-нибудь типа insert from select или update "пачкой"

когда совсем беда с объемами и есть предпосылки - то можно bulk insert и\или openrowset

притом 10 инсертов по 1 строке помедленнее одного инсерта 10 строк, а bulk в разы быстрее... (недавно играл на буке - нечто типа прайса - почти миллион строк ~5-7 сек). То есть в особо тяжелой ситуации возможно даже окажется приемлемым цепочка sql->csv->bulk
Ответ написан
SlowRider
@SlowRider Автор вопроса
Считает себя фулл-стек разработчиком;)
Если вдруг кому интересно:
курсоры заменены следующей связкой — MSSQL select-ом расчитывает таблицу недостачи, далее c# приложение по этой таблице строит csv (повторяя строки нужное число раз), и потом bulk insert-ом это затягивается в базу (спасибо, d-stream).

Производительность конкретного блока еще не считал, но общее время обработки с шести с половиной часов упало до часу сорока только за счет курсора.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы