我继承了一个噩梦般的WTF存储过程,它将300k行插入到一个出站营销电子邮件表中。我们不希望将邮件排队到正在退回的电子邮件地址。我们有一个单独的退回电子邮件表。
正确的做法是修改存储过程,使其不插入用于退回电子邮件的行。
没有人想要触摸噩梦般的集群,这就是这个特殊的sproc。因此,我们正在考虑向存储过程中添加一个delete命令。
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所以..。这样行得通吗?我可以在事务提交之前从表中删除插入吗?
发布于 2011-02-10 02:17:14
可以,您可以在事务内的表中插入和删除记录。
尝试此示例以进行概念验证:
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发布于 2011-02-10 05:20:16
我认为处理插入并正确地只插入您想要的记录是比插入然后删除更好的选择。插入250,000条记录与插入300,000条记录,然后删除50,000条记录之间应该存在显著的性能差异。您正在处理不需要处理的额外100,000条记录。咬紧牙关,正确地修复这个过程。
https://stackoverflow.com/questions/4948747
复制相似问题