Ну, я могу не получить это, но я пытаюсь ответить на это.
Вы сказали, что вам нужно высокопроизводительное решение, которое запускается часто (минимум все 2 минуты), и вам нужен хороший подход, который должен быть быстрым без блокировки. Но вы не хотите систему черного ящика.
Вместо системы черного ящика, которая используется на миллионах установок с хорошими результатами, вы пытаетесь снова изобрести колесо и создать собственное решение? Хм, звучит немного странно.
На самом деле это мои предложения.
- Репликация, даже если вы сказали, что не будете ее использовать. Это довольно простое и лучшее решение, которое вы можете использовать для этого. Репликация проста в настройке, быстро реплицируется, и вам не нужно снова изобретать колесо. Если вы просто странно относитесь к блокировке, вы можете попробовать установить
ISOLATION LEVEL
в READ_COMMITTED_SNAPSHOT
. Вы можете прочитать больше об этом здесь . Это израсходует часть вашей базы данных tempdb, но ваша таблица всегда доступна для чтения и записи, и репликация может работать в фоновом режиме.
Смотрите пример ниже:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Change Data Capture) также может быть решением. Но таким образом, вам нужно построить почти все самостоятельно. И я получил опыт, который
CDC
может быть хрупким в некоторых обстоятельствах. CDC
захватит все данные в отслеживаемой таблице (вам нужно указать каждую отслеживаемую таблицу вручную). После этого вы получите значение до и значение после того, как INSERT
, UPDATE
или DELETE
. CDC
будет удерживать эту информацию в течение определенного периода времени (вы можете указать ее самостоятельно). Подход может состоять в том, чтобы использовать CDC
на определенных таблицах, которые вам нужно наблюдать, и вручную реплицировать эти изменения в другую базу данных. Кстати, CDC
тоже использует SQL Server Replication под капотом. ;-) Подробнее об этом можно прочитать здесь .
Предупреждение: CDC
не будут знать о- DDL
изменениях. Это означает, что если вы измените таблицу и добавите новый столбец, CDC
будете наблюдать за таблицей, но игнорировать все изменения в новом столбце. На самом деле он записывает только NULL
значение до и значение после. Вам нужно DDL
повторно инициализировать его после - Изменения в отслеживаемой таблице.
- Способ, описанный выше, напоминает захват рабочей нагрузки с использованием SQL Server Profiler и ее повторное выполнение в другой базе данных для некоторых тестов. Ну, это может сработать. Но тот факт, что есть слишком много побочных эффектов, является слишком тяжелым для меня. Что вы делаете, если вы фиксируете вызов процедуры на своем клиенте. После того, как вы выполнили ту же команду в вашей основной базе данных, поскольку она не синхронизирована? Процедура может выполняться, но она может удалять / обновлять / вставлять строки, которых не было в вашем клиенте. Или как вы работаете с несколькими клиентами по одному принципу. Я думаю, что это слишком сложно. В худшем случае вы, вероятно, разрушаете свою целостность.
- Другой идеей может быть приложение или использование триггера. В зависимости от того, сколько таблиц вы хотите синхронизировать. Вы можете записать все изменения в отдельную промежуточную таблицу и запустить задание агента SQL Server все x минут, чтобы синхронизировать эти строки в промежуточной таблице с вашим мастером. Но это может быть немного тяжело, если вы попытаетесь синхронизировать (например) 150 таблиц. У тебя были бы большие накладные расходы.
Ну, это мои 2 цента. Надеюсь, у вас есть хороший обзор, и, возможно, вы нашли одно решение, которое работает для вас.