0

回避したいカーソルのパフォーマンスの問題があります。私が解決しようとしている問題は次のとおりです。メイン テーブルの各レコード (約 6000000) の列 (VARCHAR ) を (1 つの update ステートメントを使用して) 更新するには、別のカウンターを更新する必要がある UDF によって計算された結果を使用します。カウンターテーブル。
- 問題は、UDF が副作用であるため、Countertable を更新できないことです。- READONLY フラグのため、一時テーブルまたは変数テーブルも更新できません。- メイン テーブルで更新トリガーを使用しましたが、トリガーは、insert というテーブルに格納された単一の更新ステートメントによって 1 回起動されました。

私が選択した解決策は、次のように Cursor を使用することです。

  1. メイン テーブルからカーソルを作成します。
  2. 最初の行をフェッチする
  3. カウンターテーブルからカウンターを取得する
  4. カウンター++
  5. 結果、カウンターなどを計算するために PROC を呼び出す
  6. PROC からの結果でメイン テーブルを更新します。
  7. カウンターテーブルを更新する
  8. 別の行をフェッチする

しかし、約 125 時間では遅すぎると信じてください (まさか)。

誰でも私を助けることができますか?

4

1 に答える 1

1

メインテーブルに行を識別する別の列があると仮定します。そうしないと、カウンターはあまり意味がありません。

これで試すことができますか?あなたの問題を正しく理解していれば、関数もカーソルも必要ありません。単なる一時テーブルです。テーブルの読み取りと更新を同時に行うことはできません。

INSERT INTO tmpTable
SELECT
yourPrimaryKey, sex, YEAR(dob) AS dobyear, ROW_NUMBER() OVER (PARTITION BY YEAR(dob) ORDER BY dob) AS counter
FROM
mainTable;

UPDATE mainTable
SET code = CONCAT(tmpTable.sex, tmpTable.dobyear, counter)
FROM
mainTable
INNER JOIN tmpTable
ON mainTable.yourPrimaryKey = tmpTable.yourPrimaryKey;

テストされていません。構文エラーなどは許してください。

于 2013-01-24T13:58:34.823 に答える