Недавно я создал триггер SQL, чтобы заменить очень дорогой запрос, который я использовал, чтобы уменьшить количество обновлений, которые моя база данных делает каждый день.
Прежде чем выполнить обновление, я проверяю, сколько обновлений уже произошло за день, раньше это делалось с помощью запроса:
SELECT COUNT(*) FROM Movies WHERE DateAdded = Date.Now
Что ж, моя база данных содержит более 1 миллиона записей, и этот запрос выполняется примерно 1-2 тысячи раз в минуту, так что вы можете понять, почему я хотел использовать для этого новый подход.
Поэтому я создал таблицу аудита и настроил триггер SQL для обновления этой таблицы, когда в таблице Movie происходит какая-либо операция INSERT или UPDATE. Однако я заметил, что таблица аудита рассинхронизируется на несколько сотен каждый день (количество таблиц аудита выше, чем фактические обновления в таблице фильмов). Поскольку это не представляет большой проблемы, мне просто любопытно, что может быть причиной этого или как его отлаживать?
SQL-триггер:
ALTER TRIGGER [dbo].[trg_Audit]
ON [dbo].[Movies]
AFTER UPDATE, INSERT
AS
BEGIN
UPDATE Audit SET [count] = [count] + 1 WHERE [date] = CONVERT (date, GETDATE())
IF @@ROWCOUNT=0
INSERT INTO audit ([date], [count]) VALUES (GETDATE(), 1)
END
Вышеупомянутый триггер происходит только после UPDATE или INSERT в таблице Movie и пытается обновить счетчик + 1 в таблице аудита, и если он не существует (IF @@ROWCOUNT=0), он затем создает его. Любая помощь приветствуется! Спасибо.
WHERE DateAdded = Date.Now
вернул бы только счетчик INSERT. - person OGHaza   schedule 10.02.2014Movies
, было бы более разумным — SQL Server позаботился бы об его обслуживании автоматически, и вы могли бы покончить со своими триггерами. - person Damien_The_Unbeliever   schedule 10.02.2014