2011-02-09 12 views
2

私は悪質なWTF sprocを引き継いで、アウトバウンドマーケティング電子メールのテーブルに300k行を挿入します。私たちは、バウンスしている電子メールアドレスにメッセージをキューイングしません。私たちは電子メールをバウンスする別のテーブルを持っています。トランザクション内に挿入した後に削除

正しい方法は、電子メールをバウンスするために行を挿入しないようにsprocを変更することです。

この特定の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 

だからこの仕事はできますか?トランザクションがコミットする前にテーブルから挿入を削除できますか?

+1

質問が沸騰する可能性がある場合:トランザクション内で同じレコードを挿入したり削除したりすることはできますか? –

+0

ええ、でも、もし私がそれを聞いたら、人々は「はい」と言っているかもしれませんが、あなたのコードを良くして、そうする必要はありません。 –

+0

これは試してみると簡単に答えることができます。 –

答えて

0

はい、トランザクション内のテーブルにレコードを挿入し、同じレコードを削除できます。

は、概念実証のために、このサンプルをお試しください:

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 
+0

ビッグインサート(300kインサート)で50kの削除を実行することに何か影響はありますか? –

+1

これより時間がかかり、ブロックが発生する可能性があります。 – HLGEM

0

私は、インサートに取り組み、あなたが挿入してから削除するよりも良い選択である場合のみ、レコードを挿入するためにそれを正しくやって考えます。 250,000レコードを挿入して300,000を挿入してから50,000を削除することには、大きな違いがあります。あなたは処理する必要がない追加の100,000レコードを処理しています。弾丸を噛んで、プロセスを適切に修正してください。

+0

絶対に「しないでください」が正しい答えです。問題は、400以上の動的T-SQLとXML解析、文字列連結パラメータスイッチ、およびsprocを固定する他の無謀な恐怖が伴うことです。私たちの計画は、sprocを投げ捨て、それを遠ざけて全体を書き直すさらに悪いアプリです。来月。今のところ、安っぽいハックがする必要があります。 –

関連する問題