28.11.2024
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
STMatix Скрипт распределения приборов между получателями
logoffДата: Вторник, 26.03.2024, 20:39 | Сообщение # 1
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
Один из серверов получателей получает данные с одного потока достаточно медленно. Что бы ускориться, решено было разделить приборы на несколько потоков.
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
 
  • Страница 1 из 1
  • 1
Поиск:

LogOff © 2024
Сайт создан в системе uCoz Рейтинг GPS Клуба. GPS навигаторы. GPS мониториг. GPS трекеры. ГЛОНАСС