У меня есть 2 таблицы «Вектор» и «ВекторЭлемент».Вектор имеет много элементов, поэтому существует отношение внешнего ключа между Vector и VectorElement с каскадным удалением.
Vector имеет поле VectorSize, которое содержит номер количества связанных записей в VectorElement.
Очевидно, что это поле является избыточным, ноон оптимизирует производительность и делает наши запросы простыми, поскольку нас часто интересует количество элементов в векторе.
В VectorElement имеется триггер, который обновляет поле VectorSize в Vector.Этот триггер работает, но работает очень медленно, когда многие Векторные записи удаляются или вставляются в одну транзакцию.
Когда Векторы удаляются, каскадное удаление удаляет VectorElements, после чего срабатывает триггер.Теперь триггер обновляет векторную запись, которая будет удалена, что может вызвать некоторые проблемы, но это также происходит со вставками.
Вот триггер:
CREATE TRIGGER [TFact].[AfterDeleteInsertVectorElement]
ON [TFact].[VectorElement]
AFTER DELETE, INSERT
AS
BEGIN
SET NOCOUNT ON;
WITH cteChangedVectors AS
(
SELECT DISTINCT i.VectorId
FROM inserted i
UNION
SELECT DISTINCT i.VectorId
FROM deleted i
)
UPDATE
TFact.Vector
SET
VectorSize = x.size
FROM
Vector v
JOIN
(SELECT VectorId, COUNT(*) as size FROM TFact.VectorElement GROUP BY VectorId) x
ON v.Id = x.VectorId
JOIN cteChangedVectors chg ON chg.VectorId = v.Id
END