Репликация транзакций - пропустить промежуточные изменения

Jovanny
Дата: 05.02.2013 17:03:43
Всем привет!
Есть таблица, участвующая в репликации.
Она заполняется несколькими операторами в одной транзакции, типа такого:
BEGIN TRANSACTION;
	
	WITH CTE AS (SELECT ... FROM Sales WHERE ...)
	MERGE CTE WITH (TABLOCK) AS T
                USING (SELECT ... FROM ) AS S
                ON T.ProductId = S.ProductId AND T.Day = S.Day
	WHEN MATCHED AND (ISNULL(T.Price, 0.0) <> ISNULL(S.Price, 0.0) ...
		THEN UPDATE SET Price = S.Price, ...
	WHEN NOT MATCHED BY TARGET
		THEN INSERT (ProductId, Day, ...)
		VALUES(S.ProductId, S.Day,...)
	WHEN NOT MATCHED BY SOURCE
		THEN DELETE;

	UPDATE Sales WITH (TABLOCK)
	SET Price = ...
        WHERE ...

	UPDATE Sales 
	SET Price = ...
        WHERE ...

	EXEC DW.JumpingPrice

COMMIT TRANSACTION

При этом значения большинства строк в итоге не изменяется. Но все изменения,выполненные в транзакции, реплицируются, что значительно увеличивает траффик.

Каким образом можно реплицировать только итоговые изменения?
Пока есть одна идея: создать таблицу-клон, и через MERGE её обновлять.

Может, кто-нибудь ещё что-то подскажет?
Crimean
Дата: 05.02.2013 17:22:50
а это случаем не хранимкой делается? можно попробовать пробросить только вызов хранимки
Jovanny
Дата: 05.02.2013 17:24:43
В смысле репликацию выполнения процедуры?
Проблема: на подписчике нет таблиц-источников.
Crimean
Дата: 05.02.2013 17:45:38
альтернатива - попробовать добавить в UPDATE строчку WHERE <> чтобы обновлялось только то, что реально изменилось
или уже предложенный вариант через +1 табличку
invm
Дата: 05.02.2013 17:48:41
Избавится от
Jovanny
При этом значения большинства строк в итоге не изменяется
не получится?
invm
Дата: 05.02.2013 17:58:26
Еще можно навесить instead of триггер, которых будет игнорировать холостые изменения.
Jovanny
Дата: 05.02.2013 18:08:59
invm,

Насчёт триггера интересная идея. Интересно, как это скажется на производительности.
Jovanny
Дата: 05.02.2013 18:10:53
Хотя нет.
Одни и те же строки могут изменяться несколько раз за транзакцию.
Боюсь, что таблица клон - самое оптимальное решение.
invm
Дата: 05.02.2013 18:31:17
Jovanny
Одни и те же строки могут изменяться несколько раз за транзакцию.
Ну можете накапливать изменения во временной таблице и в конце транзакции применять их к основной с контролем холостых обновлений.
Jovanny
Дата: 05.02.2013 18:44:29
invm,

Спасибо, тоже вариант.