どちらが良いですか?
1) 30000レコードをループして1つずつ更新するカーソル
2) 30000 update コマンドを含むスクリプトを作成する
ありがとう
どちらが良いですか?
1) 30000レコードをループして1つずつ更新するカーソル
2) 30000 update コマンドを含むスクリプトを作成する
ありがとう
主に CURSOR の宣言方法によって異なりますが、どちらもほぼ同じ時間がかかります。
理由?通常、主な要因である 30,000 の個別の更新があります。
とにかく、バッチサイズとコンパイル時間のために、1つのバッチで30,000の個別のUPDATEがおそらく失敗することに注意してください...
SQL はセットベースの言語であり、ほとんどの場合、単一の UPDATE を実行してすべての行を一度に更新できます。できない場合、それは 2 つの理由による
より多くの情報 (SQL とロジック) があれば、さらに役立つことができます...
非常に簡単な方法があります。それを実行して、時間を測定してください。
それ以外は、10 行しかない場合、30000 行を使用してもあまり意味がありません。
データの移行やメンテナンス以外の理由でこのように更新を行うのも賢明ではないように思えます。そのような場合、パフォーマンスは問題になりませんが、メンテナンスと読みやすさは常に問題になります。
ご存じのとおり、それは文脈によって異なります。
しかし、それは学ぶのに役立ちます。たとえばSQL。ここで可能な実際の最適化が表示されないのは低レベルです。SQL は、Update、Insert、および単純な Select ステートメントだけではありません。
1) 30000レコードをループして1つずつ更新するカーソル
線形のステップバイステップ処理。SQL 自体にはユーザーが使用できるスレッド化メカニズムがないため、並列化する方法はありません。最適化は 1 つずつ行われます。つまり、クエリ オプティマイザーは一度に 1 つのステートメントで項目を調べます。
2) 30000 update コマンドを含むスクリプトを作成する
スクリプトが外部にあると仮定すると、作業を分割して複数の接続で同時に実行できます。つまり、複数の並列実行が可能です。
しかし、もっとあります:
複数の更新のためにマージステートメントを発行するスクリプトを持っているかもしれませんか? 「更新、カーソルを開く、単純な選択」以上のSQL APIを知っている場合、そこにはたくさんのバリエーションがあります。
私はそれを行います - より多くのデータ (50.000 のバッチ、時には同時に 4 ~ 6) がありますが。問題は、SQL 一括コピーにオーバーヘッドがあることです。しかし、私はその方法で毎秒 75.000 の挿入を管理しています。
多くは、ビジネス上の問題とロジックの複雑さに依存します。単純な更新の場合、問題は次のとおりです。2 倍の複数の値 = 計算、アドレスの更新 = データ主導 (つまり、どこかから新しいデータが必要)。