Удалить после вставки внутри транзакции - PullRequest
2 голосов
/ 09 февраля 2011

Я унаследовал кошмарный спроток WTF, который вставляет 300 тыс. Строк в таблицу исходящих маркетинговых писем.Мы хотим не ставить сообщения в очередь на адреса электронной почты, которые подпрыгивают.У нас есть отдельная таблица прыгающих писем.

Правильный способ сделать это состоит в том, чтобы изменить sproc так, чтобы он не вставлял строки для прыгающей электронной почты.

Никто не хочет трогать кошмарный кластерный трах, который и есть этот конкретный спрок.Таким образом, мы рассматриваем возможность добавления команды удаления в sproc.

BEGIN TRANSACTION

    --400+ lines of nightmarish WTF T-SQL, string and XML replacement nonsense goes here--
    DELETE FROM EmailQueueItems 
WHERE ToAddress IN 
    (SELECT EmailStatuses.Email FROM EmailStatuses 
        INNER JOIN EmailEventTypes on EmailEventTypes.EmailEventTypeId = EmailStatuses.EmailEventTypeId
        WHERE  EmailEventTypes.CanSendMarketing = 0)
COMMIT TRANSACTION

, так что ... это будет работать?Могу ли я удалить вставки из таблицы до совершения транзакции?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2011

Я думаю, что заняться вставкой и сделать это правильно, чтобы вставить только те записи, которые вы хотите, является лучшим выбором, чем вставка, а затем удаление.Должно быть существенное различие производительности между вставкой 250 000 записей и вставкой 300 000, а затем удалением 50 000.Вы обрабатываете дополнительные 100 000 записей, которые вам не нужны.Укуси пулю и исправь процесс правильно.

0 голосов
/ 09 февраля 2011

Да, вы можете вставлять записи и удалять их в таблицу транзакции.

Попробуйте этот пример для подтверждения концепции:

declare @foo table (id int)
begin tran

    insert into @foo 
        values (1),(2),(3)

    delete @foo where id = 2

    select * from @foo --will result in 2 rows: 1 and 3

commit tran
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...