Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
Есть временная таблица, которая обходится курсором для вычисления value хранимой процедурой.
Процесс примерно такой: таблица #Costs (id,tree_id,date,value): курсор для
exec sp @tree_id,@date,@value output
+ update для value.
В #Costs много записей и очень хочется пустить несколько курсоров, например по выборкам по разным датам.
Я не могу переписать хранимку в функцию, не могу упростить её логику - там много внутренних вызовов других хранимок и куча внутренних insert/update во временные таблицы.
Смотрю в инете, вроде рекомендуют использовать jobs Агента или как-то прикручивать Service Broker. Еще есть вариант Execute Stored Procedures in Parallel, но там для распараллеливания одного запроса.
Какие варианты лучше копать? Есть решения проще?
20 июн 14, 10:56    [16193825]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
Наилучшим вариантом будет написать процедуру для использования таблицы вместо одиночной записи на основе существующей процедуры. И никаких курсоров.
Проще - не значит лучше. Если хотите выполнить работу на "лишь бы отстали", то, да, крутите курсор и дальше.
20 июн 14, 11:03    [16193895]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
Важно оставить хранимку неизменной :(
20 июн 14, 11:07    [16193931]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Glory
Member

Откуда:
Сообщений: 104760
juwdoks
В #Costs много записей и очень хочется пустить несколько курсоров, например по выборкам по разным датам.

Интересно, а как вы "пустите несколько курсоров" по временной таблице, видимой только в одном коннекте ?
20 июн 14, 11:08    [16193942]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
Glory
juwdoks
В #Costs много записей и очень хочется пустить несколько курсоров, например по выборкам по разным датам.

Интересно, а как вы "пустите несколько курсоров" по временной таблице, видимой только в одном коннекте ?

Будет ##Costs_[@general_tree_id]
20 июн 14, 11:12    [16193969]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Glory
Member

Откуда:
Сообщений: 104760
juwdoks
Glory
пропущено...

Интересно, а как вы "пустите несколько курсоров" по временной таблице, видимой только в одном коннекте ?

Будет ##Costs_[@general_tree_id]

И в чем проблема тогда, что в разных коннектах открыто несколько курсоров по этой таблице ?
20 июн 14, 11:13    [16193974]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
juwdoks
Важно оставить хранимку неизменной :(
Это совершенно не обязательно.
Пишется новая хп, умеющая обрабатывать множество строк. Старая переписывается как обертка для вызова новой.
20 июн 14, 11:14    [16193981]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
Glory
И в чем проблема тогда, что в разных коннектах открыто несколько курсоров по этой таблице ?
Сейчас у меня один batch. Как лучше организовать эти разные курсоры одновременно? Я не делал такого раньше. Предложили даже запускать несколько powershells. Вот я и ищу рекомендацию оптимального пути: джобы Агента, Сервис Брокер и т.д. (?)
20 июн 14, 11:17    [16194004]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
invm
juwdoks
Важно оставить хранимку неизменной :(
Это совершенно не обязательно.
Пишется новая хп, умеющая обрабатывать множество строк. Старая переписывается как обертка для вызова новой.
Я понимаю, но это не из-за нежелания переписывать, это условие...
20 июн 14, 11:18    [16194019]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Glory
Member

Откуда:
Сообщений: 104760
juwdoks
Сейчас у меня один batch. Как лучше организовать эти разные курсоры одновременно?

Все просто - приложение открывает несколько конектов и в каждом запускает процедуру со своими параметрами
20 июн 14, 11:19    [16194022]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
Glory
Все просто - приложение открывает несколько конектов и в каждом запускает процедуру со своими параметрами

Сейчас "приложение" - это хп, внутри которой и есть часть проблемного кода. В рамках tsql организовать множественные курсоры лучше каким путем?
20 июн 14, 11:22    [16194048]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Glory
Member

Откуда:
Сообщений: 104760
juwdoks
Сейчас "приложение" - это хп,

ХП - это не приложение. Она не может запуситть саму себя.

juwdoks
В рамках tsql организовать множественные курсоры лучше каким путем?

Переписать процедуру.
20 июн 14, 11:26    [16194070]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8317
juwdoks
Важно оставить хранимку неизменной :(

А я не предлагал ее как-то изменять, я предложить создать новую процедуру. Там вообще вся архитектура кривая.
20 июн 14, 11:27    [16194084]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
juwdoks
В рамках tsql организовать множественные курсоры лучше каким путем?

Это кривой способ, так не надо делать.
Если Вы позарез хотите сохранить построчную обработку - сделайте клиента и вызывайте ее оттуда (запуская несколько клиентов, запуская несколько потоков в клиенте и т.п.)
20 июн 14, 11:29    [16194090]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
juwdoks
Member

Откуда:
Сообщений: 144
Ситуацию понял, всем огромное спасибо! И пиво :) На выбор - в Киеве или в Москве, но не одновременно.
20 июн 14, 11:37    [16194134]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
Glory
Member

Откуда:
Сообщений: 104760
juwdoks
но не одновременно.

И этот человек что-то хочет запрограммировать параллельно !
20 июн 14, 11:38    [16194138]     Ответить | Цитировать Сообщить модератору
 Re: Несколько курсоров одновременно на одну #table  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
juwdoks
В рамках tsql организовать множественные курсоры лучше каким путем?

  • Параллельный запуск нескольких jobs
  • Service Broker
  • Запуск внешнего приложения, реализующего параллельную обработку
  • 20 июн 14, 11:38    [16194139]     Ответить | Цитировать Сообщить модератору
     Re: Несколько курсоров одновременно на одну #table  [new]
    juwdoks
    Member

    Откуда:
    Сообщений: 144
    Glory
    И этот человек что-то хочет запрограммировать параллельно !

    :)
    invm
    juwdoks
    В рамках tsql организовать множественные курсоры лучше каким путем?

  • Параллельный запуск нескольких jobs
  • Service Broker
  • Запуск внешнего приложения, реализующего параллельную обработку

  • Так точно! Сюда и буду копать. Спасибо.
    20 июн 14, 11:42    [16194159]     Ответить | Цитировать Сообщить модератору
     Re: Несколько курсоров одновременно на одну #table  [new]
    juwdoks
    Member

    Откуда:
    Сообщений: 144
    Вобщем, красота началась отсюда: Simple way to create a SQL Server Job Using T-SQL
    Чуть подправил оригинальный код - добавил название целевой базы и автоудаление джоба после завершения.
    Теперь вместо последовательной обработки одной временной таблицы с млн. записей параллельно обрабатываются по 100 таблиц по 10к записей. Выходит на порядок быстрее.

    Остается вопрос динамической балансировки отсрочки джобов в зависимости от веса частей, чтобы сервер не заваливался (если одновременно все стартовать - cpu 99%, но, в итоге, все равно быстрее).
    27 июн 14, 09:23    [16226976]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить