Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
MathewSun Member Откуда: Москва Сообщений: 17 |
Доброе. Копируем данные до актуального состояния из одной таблицы в другую. Каждую минуту в агенте выполняется задание по синхронизации основной таблицы и вторичной с этим кодом: 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] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5516 |
это заново изобретенный велосипед оригинальное решение от микрософт - репликация https://docs.microsoft.com/en-us/sql/relational-databases/replication/transactional/transactional-replication |
||
8 авг 18, 17:37 [21634794] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Синхронизация с nolock? O_o |
8 авг 18, 17:46 [21634803] Ответить | Цитировать Сообщить модератору |
ShIgor Member Откуда: Нижний Новгород Сообщений: 2380 |
MathewSun, репликация слишком банальна... 1:1, статью исключить - проблема, те же джобы постоянно крутятся, не дай бог разъедется восстановить без бэкапов - тоже проблема. конфликты если возникли - убиться можно пока разберешься.. в этом плане интереснее change tracking + service broker.. легкий, простой, шустрый и стока понаворотить можно.. |
8 авг 18, 18:22 [21634858] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5516 |
ShIgor, почему 1:1 ? там же фильтры есть https://www.mssqltips.com/sqlservertip/4116/sql-server-transactional-replication-static-row-and-column-filters/ |
8 авг 18, 18:30 [21634865] Ответить | Цитировать Сообщить модератору |
ShIgor Member Откуда: Нижний Новгород Сообщений: 2380 |
komrad, про это и говорю, что банально. нет, я не против репликации, просто описал на что нарывался и чем проблему решил. |
8 авг 18, 18:53 [21634890] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 961 |
MathewSun, Интересно, а в исходной таблице данные никогда не обновляются, удаляются, а только вставляются? |
9 авг 18, 13:47 [21636030] Ответить | Цитировать Сообщить модератору |
MathewSun Member Откуда: Москва Сообщений: 17 |
uaggster, Да, это собирается статистика посещения, в день приходит по 300.000 записей, в Агенте SQL Server этот код запускается каждую минуту. Что-то мне подсказывает что это кривое решение..) |
9 авг 18, 20:19 [21636742] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Проблема этого решения в том, что при каноническом подходе чтения будут ожидать записи и наоборот. Если простои в записи недопустимы, то можно использовать Read Uncommitted чтения, что автоматически приводит к чтению неподтвержденных транзакций, переключить сервер или базу в режим версионирования, использовать In-memory таблицу и тому подобное. Но все эти методы имеют недостатки. Более-менее сбалансированным решением мне видится настройка CDC, но она требует определенной практики. |
10 авг 18, 11:38 [21637447] Ответить | Цитировать Сообщить модератору |
ShIgor Member Откуда: Нижний Новгород Сообщений: 2380 |
Владислав Колосов, зачем для статистики посещений CDC? СТ за глаза. |
10 авг 18, 12:41 [21637607] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
MathewSun, Решение полная дрянь. 1. Ну фиг с ним с изменениями 2. Nolock оставить - получаете непонятно что. 3. Nolock убрать можете получить пропуски. Если хотите без CT для этого есть rowversion/timestamp + min_active_rowversion |
10 авг 18, 14:46 [21637971] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
Перечисленные в 21634858 якобы проблемы, на самом деле таковыми не являются. Ваше текущее решение, CT, CDC, Service Broker как средство доставки и т.п. - просто изобретение своего велосипеда с неясными перспективами уверенной езды на нем. |
||
10 авг 18, 14:57 [21638015] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |