У меня есть две таблицы:
- tb1 (ID, AccountId, updated_at, ..., 30+ столбцов)
- tb2 (ID, AccountId, updated_at, ..., 30+ столбцов)
Я пытаюсь обновить несколько значений столбцов в tb1
, если в tb2
есть такая же строка, иначе мне нужно вставить все новые значения из tb2
, еслистрок нет в таблице tb1
.
Я использовал курсор, но он работает очень медленно.
Мой код:
DECLARE @accountId INT, @id INT,
@title NVARCHAR(1000), @num_questions INT,
@type NVARCHAR(1000), @starts_at NVARCHAR(1000),
@finishes_at NVARCHAR(1000), @published_at NVARCHAR(1000),
@summary NVARCHAR(2000), @updated_at NVARCHAR(1000)
-- Data from tb2
DECLARE quizRecSet CURSOR FOR
SELECT
AccountId, ID, title, num_questions, type,
starts_at, finishes_at, published_at, summary, updated_at
FROM
tb2
WHERE
accountId = 1
ORDER BY
updated_at DESC
OPEN quizRecSet
FETCH NEXT FROM quizRecSet INTO @accountId, @id, @title, @num_questions, @type,
@starts_at, @finishes_at, @published_at, @summary, @updated_at
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF ((SELECT COUNT(*) FROM tb1(nolock)
WHERE ID = @ID AND accountId = @accountId) = 0)
BEGIN
INSERT INTO tb1
VALUES (@accountId, @id, @title, @num_questions, @type,
@starts_at, @finishes_at, @published_at, @summary, @updated_at)
END
ELSE
BEGIN
UPDATE tb1
SET title = @title, num_questions = @num_questions,
type = @type, published_at = @published_at,
summary = @summary, updated_at = @updated_at
WHERE ID = @ID AND AccountId = @accountId
END
FETCH NEXT FROM quizRecSet INTO @accountId, @id, @title, @num_questions, @type,
@starts_at, @finishes_at, @published_at, @summary, @updated_at
END
CLOSE quizRecSet
DEALLOCATE quizRecSet
Над кодом работаеточень медленно, так как в tb1 и tb2 есть много строк (около 2M)
Как я могу изменить это для достижения более высокой производительности?