2012-04-10 16 views
0

このスクリプトは実行に時間がかかります。カーソルを削除しても、プライマリキーresponseIdのテーブルを繰り返し処理する方法はありますか?カーソルを削除してパフォーマンスを改善してください

DECLARE ResponseCursor CURSOR 
FOR 
    SELECT responseId FROM ResponseTable 

FETCH NEXT FROM ResponseCursor INTO @ResponseId 

WHILE @@fetch_Status =0 
BEGIN 
    --Insert Logic 
    FETCH NEXT FROM ResponseCursor INTO @ResponseId 
END 

CLOSE ResponseCursor 
DEALLOCATE ResponseCursor 

ありがとうございます。

+6

**正確**何 'そのロジックを挿入する 'は、あなたは同意しないでしょうか? – AakashM

+0

答えは、カーソルループ内でどのような種類のロジックが実装されているかによって異なります。 –

+0

コメントに書かれているように....それは 'insert logic'が何であるか – Lamak

答えて

1

実際には、挿入ロジックには多くのselect文があります。

私はカーソルを削除し、そのテーブルに100列とほぼ1ラフの行を持つ結合を使用して挿入し、すべてのデータを挿入するのに2分かかりました。

カーソルを使用すると18時間かかりました。

1

確かに...ちょうどそれがあなたの挿入ロジックが何であれだ、問題はカーソルではないことを

insert into MyOtherTable 
SELECT responseId, anotherField, 'static text' 
FROM ResponseTable 
-- add where clause as needed 
0

チャンスが良好で選択/挿入します。このループを実行するためにマシンに十分なメモリーがあること、および表に索引があることを確認する必要があります。開始する

いくつかの場所:

  1. は、どのくらいの時間がカーソルがないこと、SELECTステートメントを実行することがかかりますか?
  2. 挿入ロジックを1回繰り返すのにどれくらい時間がかかりますか?
  3. インサートインサートまたはインサートセレクトを実行していますか?選択の実行時間を確認し、そのクエリのインデックスを確認してください。
0

利用機能とResponseTable クロスFROMカーソル SELECT mytable1.resultのselect文と機能への参加を適用する結果のテーブルを返す、その関数の挿入ロジックであなたのselect文のラインを入れて、クロスを使用適用((関数から* ResponseTable.responseIdを選択) dd.responseId = ResponseTable.responseIdをDD)mytable1

それはむしろに依存するmytable1.responseId = ResponseTable.responseId

関連する問題