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

ありがとう。

4

4 に答える 4

1

確かに...挿入/選択するだけです

insert into MyOtherTable
SELECT responseId, anotherField, 'static text'
FROM ResponseTable
-- add where clause as needed
于 2012-04-10T12:14:21.310 に答える
1

実際、挿入ロジックには多くのselectステートメントがあります。

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

カーソルを使用すると18時間かかったため、結合を使用すると非常に高速になります。

于 2012-04-15T15:53:11.623 に答える
0

問題はカーソルではなく、挿入ロジックが何であれ、問題である可能性があります。このループを実行するのに十分なメモリがマシンにあること、およびテーブルにインデックスがあることを確認する必要があります。

開始するいくつかの場所:

  1. カーソルが実行するselectステートメントの実行にはどのくらい時間がかかりますか?
  2. 挿入ロジックを1回繰り返すのにどのくらい時間がかかりますか?
  3. Insert IntoまたはInsert-Selectを実行していますか?選択の実行にかかる時間を確認し、そのクエリのインデックスを確認します。
于 2012-04-10T12:48:26.277 に答える
0

関数を使用し、結果のテーブルを返す関数の挿入ロジックにselectステートメントの行を配置し、cross applyを使用して、カーソルのselectステートメントと関数を結合しますSELECT mytable1.result FROM ResponseTable cross apply(select * from function (ResponseTable.responseId)dd where dd.responseId = ResponseTable.responseId)mytable1

ここで、mytable1.responseId = ResponseTable.responseId

于 2013-12-10T07:35:46.643 に答える