Вы можете объединить оператор вставки / обновления в один оператор с оператором MERGE.Если вы хотите скопировать изменения ключей в статистику, вы можете использовать оператор OUTPUT.
Вам нужно добавить свои индексы к вопросу, чтобы иметь возможность комментировать их эффективность, но в основном вы хотитеодин индекс для каждой таблицы, содержащий все столбцы в предложении where.Вы хотите использовать столбцы включения для всего, что выбрано вами, но не в предложении where.
Лучший способ оптимизации - получить приблизительный / фактический план запроса и посмотреть, какие части запроса выполняются медленно.В SQL Server это делается из меню «запрос».В основном, ищите все, что говорит «сканирование», это означает, что вы пропускаете индекс."seek" - это хорошо.
Однако план запросов в основном полезен для тонкой настройки.В этом случае использование другого алгоритма (например, слияния / вывода) будет иметь более радикальное значение.
В SQL Server результаты будут выглядеть примерно так:
INSERT INTO [Statistics] (ID)
SELECT ID FROM
(
MERGE [Keys] AS TARGET
USING (
SELECT @KeyText AS KeyText, @TabID AS TabId, @CommandCode AS CommandCode, @KeySourceID AS KeySourceID, 'Added' AS CommandType
) AS SOURCE
ON (target.KeyText = source.KeyText AND target.Tab_Id = @TabID)
WHEN MATCHED AND CommandType = 'DELETED' THEN
UPDATE SET Target.CommandType = Source.CommandType, Target.CommandCode = Source.CommandCode
WHEN NOT MATCHED BY TARGET THEN
INSERT (IsChecked, KeyText, AddDateTime, Tab_Id, KeySource_ID, CommandCode, CommandType) VALUES (0, KeyText, getdate(), TabId, KeySourceId, CommandCode, CommandType)
OUTPUT $Action, INSERTED.ID
) AS Changes (Action, ID)
WHERE Changes.Action = 'INSERT'
AND NOT EXISTS (SELECT 1 FROM Statistics b WHERE b.ID = Changes.ID)