Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 одновременный update/insert в большую таблицу из нескольких подключений  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Есть таблица на локальном сервере:
create table [T_Main](
     [id] bigint identity(1,1)
    ,[SourceID] int not null
    ,[Par] varchar(50) not null
    ,[Val] varchar(50) not null
    ,[BegTime] datetime not null
    ,[EndTime] datetime not null
    ,[Count] int not null
    ,constraint [PK_T_Main] primary key clustered ([SourceID],[Parameter],[Value])
)

Есть некий софт, который проводит агрегирование данных на удалённых серверах (у каждого свой [SourceID]), возвращая таблицу такой же структуры, которая в дальнейшем сливается в таблицу [T_Main]:
update [T_Main] set [Count] = A.[Count] + B.[Count] from [T_Main] A join #Result B on A.[SourceID] = B.[SourceID] and A.[Par] = B.[Par] and A.[Val] = B.[Val]
update [T_Main] set [BegTime] = B.[BegTime] from [T_Main] A join #Result B on A.[SourceID] = B.[SourceID] and A.[Par] = B.[Par] and A.[Val] = B.[Val] where A.[BegTime] > B.[BegTime]
update [T_Main] set [EndTime] = B.[EndTime] from [T_Main] A join #Result B on A.[SourceID] = B.[SourceID] and A.[Par] = B.[Par] and A.[Val] = B.[Val] where A.[EndTime] < B.[EndTime]
insert into [T_Main] select [SourceID],[Par],[Val],[BegTime],[EndTime] from #Result A where not exists (select * from [T_Main] B on A.[SourceID] = B.[SourceID] and A.[Par] = B.[Par] and A.[Val] = B.[Val])

Про оператор MERGE я знаю, не вижу смысла переделывать, так как скрипт слияния данных от одного источника выполняется около 5 минут, что вполне приемлемо.
Канал связи достаточно узкий, а источников достаточно много (порядка 300), да и БД стала большой (больше миллиарда строк).
Когда одновременно начинают сливаться данные из нескольких источников (более 5) возникают задержки, вызванные, возможно, небольшой шириной канала или выполнением скриптов слияния из разных источников.
Ситуацию с каналами мне не побороть. Могу рулить софтом, управляя количеством одновременных процессов и очередью.
Стоит ли провести небольшое изменение в БД: в начале суток создавать вспомогательную таблицу [T_Main_] и писать данные туда, а в конце суток, выполнить слияние [T_Main_] и [T_Main]. Или же ограничивать число одновременных потоков.
Что посоветуете?
6 апр 16, 20:06    [19025066]     Ответить | Цитировать Сообщить модератору
 Re: одновременный update/insert в большую таблицу из нескольких подключений  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
=Сергей=
Что посоветуете?
Сначала выяснить причины деградации производительности, а потом уже думать как их устранять.

ЗЫ: Ваши 3 update'а замечательно объединяются в один.
6 апр 16, 20:17    [19025085]     Ответить | Цитировать Сообщить модератору
 Re: одновременный update/insert в большую таблицу из нескольких подключений  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
invm
Ваши 3 update'а замечательно объединяются в один.

буду признателен за помощь
6 апр 16, 20:21    [19025093]     Ответить | Цитировать Сообщить модератору
 Re: одновременный update/insert в большую таблицу из нескольких подключений  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
update [T_Main]
 set
  [Count] = A.[Count] + B.[Count],
  [BegTime] = case when A.[BegTime] > B.[BegTime] then B.[BegTime] else A.[BegTime] end,
  [EndTime] = case when A.[EndTime] < B.[EndTime] then B.[EndTime] else A.[EndTime] end
from
 [T_Main] A join
 #Result B on A.[SourceID] = B.[SourceID] and A.[Par] = B.[Par] and A.[Val] = B.[Val];
6 апр 16, 20:33    [19025127]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить