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

Откуда: Москва
Сообщений: 16
Доброе.
Копируем данные до актуального состояния из одной таблицы в другую.
Каждую минуту в агенте выполняется задание по синхронизации основной таблицы и вторичной с этим кодом:

declare @idMin bigint = 0
declare @rc int = 1
declare @cmd nvarchar(max)
              
select @rc = 1, @idMin = 0
while @rc>0 begin
    select top 1 @idMin = id from [dbo].a_activity ac order by id desc
    
    select @cmd = N'
select * from openquery(server2, ''select top 10000 * from dbo.activity with(nolock) 
where id>' + cast(@idMin as nvarchar(15))+ ' 
order by id'') oq'
    insert dbo.a_activity
    exec(@cmd)
    select @rc =@@rowcount
end    


Это действительно правильный способ?
Может есть более правильный способ?
8 авг 18, 17:24    [21634771]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 4526
MathewSun
Это действительно правильный способ?
Может есть более правильный способ?

это заново изобретенный велосипед

оригинальное решение от микрософт - репликация
https://docs.microsoft.com/en-us/sql/relational-databases/replication/transactional/transactional-replication
8 авг 18, 17:37    [21634794]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35693
Синхронизация с nolock? O_o
8 авг 18, 17:46    [21634803]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2114
MathewSun,

репликация слишком банальна... 1:1, статью исключить - проблема, те же джобы постоянно крутятся, не дай бог разъедется восстановить без бэкапов - тоже проблема. конфликты если возникли - убиться можно пока разберешься..

в этом плане интереснее change tracking + service broker..
легкий, простой, шустрый и стока понаворотить можно..
8 авг 18, 18:22    [21634858]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 4526
ShIgor,

почему 1:1 ?
там же фильтры есть
https://www.mssqltips.com/sqlservertip/4116/sql-server-transactional-replication-static-row-and-column-filters/
8 авг 18, 18:30    [21634865]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2114
komrad,

про это и говорю, что банально.

нет, я не против репликации, просто описал на что нарывался и чем проблему решил.
8 авг 18, 18:53    [21634890]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
uaggster
Member

Откуда:
Сообщений: 459
MathewSun, Интересно, а в исходной таблице данные никогда не обновляются, удаляются, а только вставляются?
9 авг 18, 13:47    [21636030]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
MathewSun
Member

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

Да, это собирается статистика посещения, в день приходит по 300.000 записей, в Агенте SQL Server этот код запускается каждую минуту.
Что-то мне подсказывает что это кривое решение..)
9 авг 18, 20:19    [21636742]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
Wlr-l
Member

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

И в чем Вы видите кривоту? В принципе, простое и надежное решение для Вашей задачи. С репликацией, скорее всего, не справитесь.

В день приходит 300000 записей, обновление производите каждую минуту, т.е. скорость изменения 300000/(24*60)=208 строк в минуту. C top 10000 можно обойтись и без цикла while, и даже без top, т.к. есть where id>idMin. Да у Вас и id это nvarchar(15), ужас! 30 байт вместо 4!

Есть ли смысл синхронизировать так часто? Что произойдет если интервал синхронизации увеличить до 60 минут? Мироздание не рухнет? В смысле статистика не протухнет?
10 авг 18, 10:38    [21637326]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5735
Проблема этого решения в том, что при каноническом подходе чтения будут ожидать записи и наоборот.
Если простои в записи недопустимы, то можно использовать Read Uncommitted чтения, что автоматически приводит к чтению неподтвержденных транзакций, переключить сервер или базу в режим версионирования, использовать In-memory таблицу и тому подобное. Но все эти методы имеют недостатки. Более-менее сбалансированным решением мне видится настройка CDC, но она требует определенной практики.
10 авг 18, 11:38    [21637447]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2114
Владислав Колосов,

зачем для статистики посещений CDC? СТ за глаза.
10 авг 18, 12:41    [21637607]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
Wlr-l
Member

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

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

В данной задаче копируются только те строки, которые появились после последней синхронизации. Связь между серверами уже есть, исходное решение работает, но у ТС есть сомнение, не криво ли оно? С моей точки зрения это нормальное решение, не требующее дополнительных настроек сервера. Его можно немного упростить:
declare @idMin bigint = 0;
declare @cmd nvarchar(1000);
              
select top 1 @idMin = id from dbo.a_activity ac order by id desc;
    
set @cmd = N'select * from openquery(server2, ''select * from dbo.activity where id>' + cast(@idMin as nvarchar(15)) + ''')';
--print @cmd;

insert dbo.a_activity
  exec(@cmd)

Осталось выяснить как часто нужно выполнять эту операцию.
10 авг 18, 14:36    [21637944]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5458
MathewSun,

Решение полная дрянь.
1. Ну фиг с ним с изменениями
2. Nolock оставить - получаете непонятно что.
3. Nolock убрать можете получить пропуски.

Если хотите без CT для этого есть rowversion/timestamp + min_active_rowversion
10 авг 18, 14:46    [21637971]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование постоянная синхронизация таблиц)  [new]
invm
Member

Откуда: Москва
Сообщений: 8072
MathewSun
Что-то мне подсказывает что это кривое решение..)
Правильное решения вам уже назвали - штатная репликация. В вашем случае транзакционная.
Перечисленные в 21634858 якобы проблемы, на самом деле таковыми не являются.

Ваше текущее решение, CT, CDC, Service Broker как средство доставки и т.п. - просто изобретение своего велосипеда с неясными перспективами уверенной езды на нем.
10 авг 18, 14:57    [21638015]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить