2012-03-01 12 views
1

Excelのレコードの大量を一時テーブルにアップロードしています。次に、これらの行を合計し、PKでメインテーブルに集計する必要があります。どちらが速いですか?ストアドプロシージャの挿入またはダイレクト後のトリガー

挿入後にメインテーブルに挿入されているかどうかを確認するトリガーを作成しました(既存のものは挿入されず、既存のものはその行のすべての列が更新されます)。

はので、私はその後、トリガは、メインテーブルに/更新を挿入する別の一時表

INSERT INTO TEMPTBL (select SUM(...)...* from temptable)

に挿入する必要があり、このTRIGGERをトリガします。

これは適切な方法か単なるTEMPテーブルを使用してSPを使用して、1つのCURSOR FETCH(既存の行の更新用)と残りの用の挿入を使用して検査することです。

ありがとうございます。これらは複数のユーザーを処理するため、理想的であるか高速であるかを知る必要があります(デッドロックはまだ心配しないでください)。

答えて

3

手順的な(行単位)私はあなたがやっていることのためのセットベースのソリューション(一度にすべてのレコード)があるべきだと思います。

トリガーまたはカーソルの代わりに、すべてのレコードを一度に挿入し、挿入ステートメントに、すでにテーブルに存在するレコードを除外するチェックを追加します。あなたの更新のために

、あなたが似たような操作を行うことができます。

INSERT INTO YourTable (Column1, Column2...) 
SELECT Column1, Column2... 
FROM TempTable tt 
WHERE NOT EXISTS (
    SELECT 1 
    FROM YourTable yt 
    WHERE tt.ID = yt.ID 
) 

EDIT:ような何か。挿入する前に、既存のテーブルに一時テーブルを追加し、一致するレコードを更新します。

UPDATE yt 
SET Column1 = tt.Column1, Column2 = tt.Column2 
FROM 
    YourTable yt JOIN 
    TempTable tt ON tt.ID = yt.ID 
+0

これは、INSERTパートのSPで行ったことです。問題の部分はアップデートになります。私は既存の行のいくつかの列を更新する必要があります。 – Sid

+0

私は、DELETE * FROM WHEREの行が存在すると思います。残りの部分に挿入します。それは大丈夫でしょうか?また、ユーザーが何千もの行をアップロードする可能性があるため、これらのログを最小限に抑えるにはどうすればよいでしょうか。私はTRUNCATE TABLEを使用していますが、私はすぐに他のユーザーの最近アップロードされたデータを切り捨てるのではないかと心配しています。 :D – Sid

+1

@sid最初は何千もの行がたくさんあるように見えますが、SQL Serverは何百万もの処理に対応しています。クリーンでセットベースのアプローチを取っている限り、パフォーマンスについてあまり心配する必要はないと思います。これを念頭において、更新ステートメントは、削除/挿入より少ないログ・エントリを生成します。私はあなたがすべてを切り捨てる必要があるとは思わない...あなたの一時テーブルは接続ごとにする必要があります、そして、あなたが完了したらそれは自動的にクリーンアップされます。参照してください –

関連する問題