0

どちらが良いですか?

1) 30000レコードをループして1つずつ更新するカーソル

2) 30000 update コマンドを含むスクリプトを作成する

ありがとう

4

3 に答える 3

2

主に CURSOR の宣言方法によって異なりますが、どちらもほぼ同じ時間がかかります。

理由?通常、主な要因である 30,000 の個別の更新があります。

とにかく、バッチサイズとコンパイル時間のために、1つのバッチで30,000の個別のUPDATEがおそらく失敗することに注意してください...

SQL はセットベースの言語であり、ほとんどの場合、単一の UPDATE を実行してすべての行を一度に更新できます。できない場合、それは 2 つの理由による

  1. 「行ごと」のロジックが必要です。これは通常、CASE 式、UDF などによって実現できます。
  2. セットと SQL を理解していない

より多くの情報 (SQL とロジック) があれば、さらに役立つことができます...

于 2013-01-16T07:56:00.370 に答える
0

非常に簡単な方法があります。それを実行して、時間を測定してください。

それ以外は、10 行しかない場合、30000 行を使用してもあまり意味がありません。

データの移行やメンテナンス以外の理由でこのように更新を行うのも賢明ではないように思えます。そのような場合、パフォーマンスは問題になりませんが、メンテナンスと読みやすさは常に問題になります。

于 2013-01-16T07:44:24.543 に答える
0

ご存じのとおり、それは文脈によって異なります。

しかし、それは学ぶのに役立ちます。たとえばSQL。ここで可能な実際の最適化が表示されないのは低レベルです。SQL は、Update、Insert、および単純な Select ステートメントだけではありません。

1) 30000レコードをループして1つずつ更新するカーソル

線形のステップバイステップ処理。SQL 自体にはユーザーが使用できるスレッド化メカニズムがないため、並列化する方法はありません。最適化は 1 つずつ行われます。つまり、クエリ オプティマイザーは一度に 1 つのステートメントで項目を調べます。

2) 30000 update コマンドを含むスクリプトを作成する

スクリプトが外部にあると仮定すると、作業を分割して複数の接続で同時に実行できます。つまり、複数の並列実行が可能です。

しかし、もっとあります:

  • 新しい値を計算するスクリプトを作成します。
  • buld copy API を使用して一時テーブルに一括インポートする
  • 更新された値を一時テーブルから最終テーブルに取得する 1 つの更新ステートメントを発行します。

複数の更新のためにマージステートメントを発行するスクリプトを持っているかもしれませんか? 「更新、カーソルを開く、単純な選択」以上のSQL APIを知っている場合、そこにはたくさんのバリエーションがあります。

私はそれを行います - より多くのデータ (50.000 のバッチ、時には同時に 4 ~ 6) がありますが。問題は、SQL 一括コピーにオーバーヘッドがあることです。しかし、私はその方法で毎秒 75.000 の挿入を管理しています。

多くは、ビジネス上の問題とロジックの複雑さに依存します。単純な更新の場合、問題は次のとおりです。2 倍の複数の値 = 計算、アドレスの更新 = データ主導 (つまり、どこかから新しいデータが必要)。

于 2013-01-16T07:59:01.633 に答える