Один из серверов получателей получает данные с одного потока достаточно медленно. Что бы ускориться, решено было разделить приборы на несколько потоков.
ID пользователей, куда должна быть подписка известна
Скрипт выбирает все подписки на пользователей с определенным ID, и потом делит приборы (по остатку от деления на 4 ) на 4-ей получаетлей, за каждым из которых своя служба отправки.
Ограничение - проборы не должны содержать несколько подписок на анализируемых пользователей, иначе скрипт остановится с ошибкой
Например, прибор 000000 не должен содержать подписок на 9 и 22 одновременно (должно быть или 9, или 22, или 24, или 25).
Другие подписки не изменяются и не анализируются.
В скрипте жестко прописано деление на 4, но это легко исправить в нескольких местах
Код
IF OBJECT_ID(N'tempdb..#temp_d') IS NOT NULL
BEGIN
DROP TABLE #temp_d
END
-- таблица: ID, отстаток от деления
create table #temp_d (
LoginID int,
ostatok int)
insert into #temp_d
values (9,0)
insert into #temp_d
values (22,1)
insert into #temp_d
values (24,2)
insert into #temp_d
values (25,3)
/* выборка начальная */
/*
select * from [ST-MATIX].[dbo].
[Subscriptions]where LoginID in (select LoginID from #temp_d)
*/
-- %4 - делим на 4,
/* изменение таблицы - перераспределение подписок */
update [ST-MATIX].[dbo].
[Subscriptions]set LoginID = t.LoginID
FROM [ST-MATIX].[dbo]. [Subscriptions]as sub
inner join [ST-MATIX].dbo.DevicesOnObjects as don on don.ObjectID = sub.ObjectID
inner join [ST-MATIX].dbo.Devices as d on d.DeviceID = don.DeviceID
inner join #temp_d as t on cast(right(d.DevNum,2) as int) %4 = t.ostatok
where sub.LoginID in (select LoginID from #temp_d)
/* выборка результатов */
select sub.*, d.DevNum,cast(right(d.DevNum,1) as int) %4 from [ST-MATIX].[dbo]. [Subscriptions]as sub
inner join [ST-MATIX].dbo.DevicesOnObjects as don on don.ObjectID = sub.ObjectID
inner join [ST-MATIX].dbo.Devices as d on d.DeviceID = don.DeviceID
where LoginID in (select LoginID from #temp_d)
select LoginID, count(*) from [ST-MATIX].[dbo]. [Subscriptions]as sub
where LoginID in (select LoginID from #temp_d)
group by LoginID
drop table #temp_d