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

Откуда: Москва
Сообщений: 180
Допустим есть 50+ серверов s01, s02,..s50 - MS SQL Express 2014
На весь этот зоопарк есть один сервер MS SQL 2014 (s00) с некой "взрослой" установкой (Standard, Enterprise,... )
На всех 50-ти серверах есть одинаковые сохраненные процедуры, возвращающие наборы данных одного типа:
Id, Date, f1, f2,...fn
требуется на сервере S00 (например во временную таблицу) асинхронно, получить результаты выполнения этих 50 процедур например, в виде этого:
select ‘S01’, Id, Date, f1, f2,...fn from s01.. union all
select ‘S02’, Id, Date, f1, f2,...fn from s02.. union all..
select ‘S50’, Id, Date, f1, f2,...fn from s50.. 
order by Date desc 


Есть так же некое предельное время ожидания результатов этого общего запроса: TimeOut = 10 сек
Поэтому нужно еще некое итоговое сообщение вроде:
Server s41 – сейчас недоступен
Server s47 – Превышено время ожидания выполнения запроса – попробуйте увеличить TimeOut

Понятно, что есть вариант - решать через Linked сервера, и распределенные запросы.

Вопрос:
Какими методами лучше всего реализовать этот распределенный запрос, чтобы получать результаты
максимально быстро?
И как лучше (проще) всего организовать асинхронность выполнения всех запросов в данном случае?
24 ноя 16, 10:37    [19928680]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Молодой
Вопрос:
Какими методами лучше всего реализовать этот распределенный запрос, чтобы получать результаты
максимально быстро?
И как лучше (проще) всего организовать асинхронность выполнения всех запросов в данном случае?

Service Broker?
24 ноя 16, 10:52    [19928747]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
gds,
SSIS-пакет?
24 ноя 16, 10:55    [19928759]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
gds,

Вот Service Broker как раз слабо знаю.
Он хорошо подходит для этой задачи, или есть лучше методы?
24 ноя 16, 10:56    [19928768]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
aleks2
Guest
Меня таки умиляет

1. "есть одинаковые сохраненные процедуры, возвращающие наборы данных одного типа"
union all

Рекордсеты процедур невозможно union all

2. С этого я ваще плачу
"order by Date desc "

3. Ну а здесь слов просто нет "Понятно, что есть вариант - решать через Linked сервера, и распределенные запросы."

ЗЫ. Если вам "истинную паралельность" до усрачки хоцца:
1. Пишете процедуру получения данных с "произвольного сервера" с обработкой ошибок и логгированием.
Без "Linked сервера, и распределенных запросов". Как вам это удастся - хрен знает.
2. Пишете 50+ JOB-ов с ваызовом этой процедуры для каждого из серверов.
3. Делаете расписание на запуск всех 50+ JOB-ов в один момент.
24 ноя 16, 10:59    [19928788]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Руслан Дамирович
gds,
SSIS-пакет?

Сложнее дебажить, + если надо добавить удалить сервер это либо: делать динамические запросы в пакете с параметрами на том же s00. Либо постоянная перекомпиляция и деплой пакета со всем вытекающими.
Service Broker, имхо, лучше маштабируется для данных задач. К тому же можно использовать группы на отправителе что бы гарантированно получать очередность результатов. + в сообщение можно добавить не только результат, но и другие параметры (время выполнения, время старта, и т.п.).
24 ноя 16, 11:15    [19928873]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
aleks2

Рекордсеты процедур невозможно union all
С этого я ваще плачу "order by Date desc "
.


То что "Рекордсеты процедур невозможно union all" это мне известно.
Смысл в том что надо получить ТОП самых свежих записей с каждого сервера, и из них выбрать самые свежие.
Описал так, чтобы понятнее общая задача была.

Итого ваше решение, это процедура на сервере s00, которая дергает данные с указного ей линкованого сервера,
и помещает их например в некую временную таблицу ##t на СЕРВЕРЕ s00
Эта процедуру одновременно вызываем 50-ю джобами, а итоговые результаты вытягиваем из ##t
- Правильно я понял?
24 ноя 16, 11:20    [19928898]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
gds
Руслан Дамирович
gds,
SSIS-пакет?

Сложнее дебажить, + если надо добавить удалить сервер это либо: делать динамические запросы в пакете с параметрами на том же s00. Либо постоянная перекомпиляция и деплой пакета со всем вытекающими.
Service Broker, имхо, лучше маштабируется для данных задач. К тому же можно использовать группы на отправителе что бы гарантированно получать очередность результатов. + в сообщение можно добавить не только результат, но и другие параметры (время выполнения, время старта, и т.п.).


С SSIS как то совсем тоскливо - мало опыта ).
Если Service Broker как говорите подходит буду копать, в его сторону.
С генерацией 50+ джобов тоже интересно.
24 ноя 16, 11:27    [19928944]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Молодой,

напишите приложение с GUI, если для управления вам нужна интерактивность и Вам лень деплоить пакеты. Посадите оператора за приложение.
Это оптимальное решение, избавляющее от линков и порога вхождения.
24 ноя 16, 11:27    [19928947]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
Молодой
Итого ваше решение, это процедура на сервере s00, которая дергает данные с указного ей линкованого сервера,
и помещает их например в некую временную таблицу ##t на СЕРВЕРЕ s00
Эта процедуру одновременно вызываем 50-ю джобами, а итоговые результаты вытягиваем из ##t
- Правильно я понял?
В одну таблицу параллельно не получится, они одновременно начнут ее блокировать. Надо раскидывать в 50 таблиц, потом уже union all.
24 ноя 16, 11:28    [19928951]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
Владислав Колосов
Молодой,

напишите приложение с GUI, если для управления вам нужна интерактивность и Вам лень деплоить пакеты. Посадите оператора за приложение. Это оптимальное решение, избавляющее от линков и порога вхождения.


Такой вариант тоже приемлем.
Приложение конечно же уже есть, – как без него ? )
Занимается оно тем, что получает данные описаной выше процедуры с ОДНОГО из серверов s01, s02…

Задача если совсем широко на нее смотреть – самыми малыми изменениями именно в приложении,
сделать ему возможность получать те же результаты что оно до сих пор получало отдельно с s01,
в зависимости от прав пользователя теперь получать для s01 union all s02 или s07 union all s43 union all …..
24 ноя 16, 12:03    [19929193]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Три стакана
Member

Откуда:
Сообщений: 4
репликацией собирать данные с серверов-подписчиков ? Можно даже в одну таблицу, главное чтобы они не конфликтовали.
24 ноя 16, 12:30    [19929329]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
Три стакана
репликацией собирать данные с серверов-подписчиков ? Можно даже в одну таблицу, главное чтобы они не конфликтовали.


Там же на s01, s02... SQL Express версии.
Разве получится настроить такую репликацию с s01, s02... на s00 ?
24 ноя 16, 12:55    [19929463]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Молодой
Разве получится настроить такую репликацию с s01, s02... на s00 ?
Получится.
Merge-репликация, s00 - издатель, все экспрессы - подписчики.
24 ноя 16, 13:45    [19929717]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
qwertEHOK
Member

Откуда: Волгоград
Сообщений: 273
а почему не выполнять все эти процедуры локально и сохранять локально же в таблицу с, допустим уникальным ID
а из центра получать все строки с максимальным ID
24 ноя 16, 15:07    [19930234]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
gds
Service Broker?


+100500
24 ноя 16, 16:38    [19930742]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
qwertEHOK
а почему не выполнять все эти процедуры локально и сохранять локально же в таблицу с, допустим уникальным ID
а из центра получать все строки с максимальным ID


Основная проблема - скорость - 10 сек это полный предел.
Идеал в пределах секунды иметь ответ со всех серверов.

В вашем решении не решена проблема одновременного запроса ко всем источникам, - придется ждать очередь выполнения запросов к s01, s02...
К этому решению придется докручивать вышеописаные способы, для получения "одновременности" всех этих запросов.
24 ноя 16, 16:38    [19930746]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Молодой
С генерацией 50+ джобов тоже интересно.


Для сервисброкера джобы не нужны. Достаточно повесить таймер на определенный промежуток времени и по нему слать клиенту сообщение "Get_NewData" или что-то подобное. Ну и клиент должен в ответ отправить свои новые данные.
24 ноя 16, 16:40    [19930762]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Молодой
Владислав Колосов
Молодой,

напишите приложение с GUI, если для управления вам нужна интерактивность и Вам лень деплоить пакеты. Посадите оператора за приложение. Это оптимальное решение, избавляющее от линков и порога вхождения.


Такой вариант тоже приемлем.
Приложение конечно же уже есть, – как без него ? )
Занимается оно тем, что получает данные описаной выше процедуры с ОДНОГО из серверов s01, s02…

Задача если совсем широко на нее смотреть – самыми малыми изменениями именно в приложении,
сделать ему возможность получать те же результаты что оно до сих пор получало отдельно с s01,
в зависимости от прав пользователя теперь получать для s01 union all s02 или s07 union all s43 union all …..

А что мешает в этом самом приложении запустить 50 потоков?
25 ноя 16, 00:44    [19932242]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
А что мешает в этом самом приложении запустить 50 потоков?


По хорошему именно так и делать бы надо )
но есть организационные проблемы, которые не позволяют это сделать .
Поэтому и смотрел в сторону получения "склееных" результатов именно на сервере s00.

В итоге понравились две схемы: с настройкой репликаций и генерацией потоков в 50+ джобах.
Буду копать их.
Вопрос закрыт. Спасибо всем кто принял участие!
25 ноя 16, 10:33    [19932862]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
В итоге понравились две схемы


Точнее три ): репликация, Service Broker и Job.

Спасибо всем !
25 ноя 16, 10:39    [19932887]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Молодой,

приходите через пару недель... расскажите как работает это все
25 ноя 16, 11:12    [19933054]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Неужели так сложно написать пакет SSIS и брать коннекты из таблички на сервере? Изобретают же люди себе развлечения...
25 ноя 16, 11:22    [19933132]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4178
Mike_za
Молодой,

приходите через пару недель... расскажите как работает это все


ну, или когда получится
25 ноя 16, 11:57    [19933402]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация асинхронного запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Владислав Колосов
Неужели так сложно написать пакет SSIS и брать коннекты из таблички на сервере? Изобретают же люди себе развлечения...
Сложно, это ведь тут и обсуждают.
К сожалению, нет в SSIS асинхронных вызовов, равно как и встроенного контейнера для асинхронного запуска (типа for each parallel)
25 ноя 16, 12:16    [19933533]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить