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

Откуда:
Сообщений: 38
У меня 5 серверов mssql (10,11 и 13) и на них есть 14 баз.
Мне надо в каждой базе запустить вот такой запрос:
SELECT
	'ООО "СЕРВИС"'  Организация,
	СкладКомпании._Description Склад,
	CASE
	WHEN Заказ._Number  is not null THEN   'Заказ покупателя № '+ Заказ._Number + ' от 'ELSE 
	'Внутренний заказ № '+ ЗаказВнутр._Number + ' от 'END ИмяДокумента,
	CASE
	WHEN Заказ._Number  is not null THEN Заказ._Date_Time ELSE 
	ЗаказВнутр._Date_Time END ДатаЗаказа,
	CASE
	WHEN Контрагент._Description is not null THEN
	Контрагент._Description ELSE Подразделение._Description end Контрагент, 
	Ном._Fld1139 Артикул,
	ОстаткиРезервов._Fld8533 Заказано,
	ОстаткиРезервов._Fld8534 Резерв
	FROM
	 [alfa5_as].[dbo]._Reference68  AS Ном 
	LEFT OUTER JOIN [alfa5_as].[dbo]._AccumRgT8545 as ОстаткиРезервов On ОстаткиРезервов._Fld8530RRef = Ном._IDRRef
	LEFT OUTER JOIN [alfa5_as].[dbo]._Reference59 Контрагент      On ОстаткиРезервов._Fld8528_RRRef = Контрагент._IDRRef
	LEFT OUTER JOIN [alfa5_as].[dbo]._Document162 Заказ           On ОстаткиРезервов._Fld8529_RRRef = Заказ._IDRRef
	LEFT OUTER JOIN [alfa5_as].[dbo]._Reference74 Подразделение   On ОстаткиРезервов._Fld8528_RRRef = Подразделение._IDRRef
	LEFT OUTER JOIN [alfa5_as].[dbo]._Document159 ЗаказВнутр      On ОстаткиРезервов._Fld8529_RRRef = ЗаказВнутр._IDRRef
	LEFT OUTER JOIN [alfa5_as].[dbo]._Reference92 СкладКомпании   On ОстаткиРезервов._Fld8532RRef = СкладКомпании._IDRRef
Where (case when @Article = '' then @Article else Ном._Fld1139  end) = @Article 
and ОстаткиРезервов._Period > CAST('5999-10-01 00:00:00.000' as datetime) 
and (ОстаткиРезервов._Fld8534 > 0 or ОстаткиРезервов._Fld8533 > 0 )


1. Сначала я сделал представление (0назавем локальное) на каждом сервер по всем базам (без параметра @Article конечно).
И еще одно представление чтоб собирала в одну таблицу результат из всех локальных представлений.
А потом уже применял на это Where Ном.Артикул = @Article
2. Пробовал сделать функцию по тому же принципу, но оказалось нельзя вызывать функции со связного сервера, возвращающие таблицы.
3. Сделал функцию со всеми Селктами по всем связанным серверам.

В итоге Первый вариант медленный, воторой не работает, а третий еще медленней чем первый!

Как еще можно решить такую задачу? Какие еще варианты решения есть?

Требуется видеть остатки онлайн.
15 июн 17, 15:29    [20567332]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
TimofeySin,

репликация?
15 июн 17, 16:03    [20567520]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
TimofeySin
Member

Откуда:
Сообщений: 38
Это 1С оно не дружит с репликацией.
15 июн 17, 16:07    [20567528]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
dies irae
Member

Откуда:
Сообщений: 78
TimofeySin,

На центральном сервере создать по одному представлению для каждого удалённого сервера (через linked server). (без параметра @Article конечно).
Сервера обрабатывать последовательно, вставляя в одну результирующую таблицу, например:
merge result using (select * from view_01 where Артикул=@Article or @Article='') as source on result.pk_column =  source.pk_column
   when not matched then insert...
   when matched then update...
   ...
15 июн 17, 16:47    [20567683]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
TimofeySin
Это 1С оно не дружит с репликацией.


Можно сделать через Broker:
запрос выполнять на каджой базе локально, слать сообщение в очередь центрального сервера, а он будет ловить и обрабатывать.
15 июн 17, 16:49    [20567692]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
TimofeySin
Member

Откуда:
Сообщений: 38
dies irae
На центральном сервере создать по одному представлению для каждого удалённого сервера (через linked server). (без параметра
[/src]

Ну то есть создать одну большую таблицу остатков и её по кругу постоянно обновлять... Как-то затратно пом...


Ролг Хупин
Можно сделать через Broker:

С брокером не работал. Ну то есть клиент обращается в процедуру, процедура шлет сообщения всем серверам, они возвращают некий ответ (как я понимаю обязательно сериализовать придет таблицу ответа). Я эти ответы пихаю в таблицу и возвращаю.
Сложно, но можно попробовать...
15 июн 17, 18:02    [20568011]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
dies irae
Member

Откуда:
Сообщений: 78
TimofeySin
Ну то есть создать одну большую таблицу остатков и её по кругу постоянно обновлять... Как-то затратно пом...

можно и не делать.
если данные нужны изредка, можно создать хранимую процедуру/функцию с параметром @article.
которая сделает union all из всех view и вернёт данные
это при условии, что все сервера всегда доступны
15 июн 17, 18:13    [20568040]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7763
TimofeySin,

А чем здесь будет отличаться брокер от прямых запросов?
15 июн 17, 18:16    [20568047]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7763
Брокер поможет только если вторичные базы будут пушить данные в центральную таблицу. Получится самодельная репликация.
15 июн 17, 18:20    [20568058]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
TimofeySin
Member

Откуда:
Сообщений: 38
dies irae
если данные нужны изредка

Данные нужны часто.

Владислав Колосов
TimofeySin,
А чем здесь будет отличаться брокер от прямых запросов?

Да вот локально запрос делается 00:00:00 секунд.
А он же, только с другого сервера делается 00:00:04 секунды.
Может с брокером будет как на локальном...
15 июн 17, 18:23    [20568062]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
мегамозг
Member

Откуда: Екатеринбург
Сообщений: 71
TimofeySin, у нас 40 серверов-баз, с кот-х периодически нужно получать какие-то селекты.
Решил ч-з сбор данных из стороннего приложения.
Создал таблицу с реквизитами каждого сервера-базы, и циклом по этой таблице запускал выборку.
15 июн 17, 19:03    [20568171]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
мегамозг
Member

Откуда: Екатеринбург
Сообщений: 71
мегамозг, упс, про "требуется онлайн" не заметил.
У нас выборка по всем базам по запросу стартует.
Так что, видимо, этот вариант тебе не подойдёт.
15 июн 17, 19:19    [20568227]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
_Gavrysh_
Member

Откуда:
Сообщений: 130
TimofeySin,
решил подобную задачу динамическим запросом по циклу обращающийся к разным серверам и базам.
Для облечения создал таблицу, где храню координаты обращений.
Результаты сливаю в итоговую таблицу.
15 июн 17, 21:54    [20568453]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
TimofeySin,

А через локальную серверную группу не пробовали запускать запросы?
16 июн 17, 09:12    [20569039]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7763
Синхронный запрос плох тем, что не обеспечивает высокую доступность.
16 июн 17, 11:44    [20569577]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
TimofeySin
Member

Откуда:
Сообщений: 38
Jovanny
TimofeySin,

А через локальную серверную группу не пробовали запускать запросы?

А чтойто? Можно ссылку или еще что, чтоб почитать.
17 июн 17, 21:20    [20572284]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31356
TimofeySin
Jovanny
TimofeySin,

А через локальную серверную группу не пробовали запускать запросы?

А чтойто? Можно ссылку или еще что, чтоб почитать.
Если нужно выполнить запрос в SSMS сразу на нескольких серверах, то можно это сделать, выполнив его на группе.
https://www.osp.ru/winitpro/2016/09/13050299/

Но это не для работы из приложения, это для администратора.
18 июн 17, 02:30    [20572540]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
TimofeySin
dies irae
если данные нужны изредка

Данные нужны часто.

Владислав Колосов
TimofeySin,
А чем здесь будет отличаться брокер от прямых запросов?

Да вот локально запрос делается 00:00:00 секунд.
А он же, только с другого сервера делается 00:00:04 секунды.
Может с брокером будет как на локальном...


Всё от задачи зависит.
Брокер не ускорит выполнение, но с помощью очереди сообщений можно сделать асинхронную отправку.
Например, на всех серверах запросы выполняются локально, результаты каждый шлет через брокер на центральный, там собирать и выдавать общий результат.
Или - центральный рассылает сообщения на все серверы, они получают и выполняют каждый у себя запросы и шлют обратно результаты. И т.д.
18 июн 17, 15:39    [20572967]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
TimofeySin
Member

Откуда:
Сообщений: 38
alexeyvg
Если нужно выполнить запрос в SSMS сразу на нескольких серверах, то можно это сделать, выполнив его на группе.
https://www.osp.ru/winitpro/2016/09/13050299/

Не пойдет, у меня везде запрос разный (имена таблиц и полей разные)
Буду пробовать через консолидированную таблицу тогда...
19 июн 17, 08:41    [20573659]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1123
Вопрос, а остатки нужны по всем позициям сразу или обычно идет запрос остатков по какой-то конкретной позиции которую надо пробить во всех БД?
19 июн 17, 09:53    [20573782]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать чтоб быстро собирать данные по 14 базам?  [new]
TimofeySin
Member

Откуда:
Сообщений: 38
энди
Вопрос, а остатки нужны по всем позициям сразу или обычно идет запрос остатков по какой-то конкретной позиции которую надо пробить во всех БД?

Идет запрос остатков по какой-то конкретной позиции которую надо пробить во всех БД.
19 июн 17, 10:14    [20573813]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить