0


1

  • TableToUpdate Dates という2つのテーブルがあります。 * TableToUpdate *のEndTimeKey列を他のテーブル Dates *から見て更新する必要があります。 これを行うには以下のsqlを実行しますが、完了するまでに時間がかかります。

Table * TableToUpdate *には6Mレコードがあります。 Table * Dates *には5000レコードがあります。

どうすれば最適化できますか。

返信ありがとうございます。

TableToUpdateを更新してEndTimeKey = DATE_NOをEndTime = DATEの日付から設定する

4 Answer


2


潜在的に600万レコードを更新しています、これはいずれにしてもひどく速くなることはないでしょう。 ただし、実行計画を調べて、それが索引を使用しているかどうかを確認してください。

これをバッチで実行することもできます。一般的に、大量のレコードを更新する場合は高速です。 データベースへの負荷がほとんどない時間帯に更新を実行すると、潜在的なロックの問題が軽減されます。 暗黙的な変換をする必要がないように、2つのテーブル間でデータ型が同じであることを確認してください。

更新しているテーブルを見てください。何かトリガーはありますか? トリガーの作成方法によっては、これは多くのレコードの更新を著しく遅くする可能性があります(明るすぎない人がセットベースのコードを書く代わりにカーソルにカーソルまたはループを置くことを決めた場合)。

また、ここに私が追加するものがいくつかあります(私はそれが明示的に結合を表示するように変更しました)

TableToUpdateからEndTimeKey = DATE_NOを設定します。t t.EndTime = d.DATEに日付Dを結合します。EndTimeKey <> DATE_NO

すでに一致したレコードを更新しても意味がありません。


1


この大量のデータを使用すると、新しいテーブルを見たいときに、更新された値を含む結果セットを生成するSELECTクエリを作成するのが最善の方法です。 次に、テーブルを作成してINSERT INTOを使用するか、新しいテーブルを作成するためにINTOを追加してSELECTを変更することによって、これらを新しいテーブルにSELECTします(おそらく 'NewTableToUpdate')。

次にsp_renameを使用して、 'TableToUpdate’を 'OLDTableToUpdate’に、 'NEWTableToUpdate’を 'TableToUpdate’にそれぞれ名前を変更してから、元のテーブルにあるとおりにインデックスを作成します。

私の経験では、これがこのような大きな変化を達成するための最も早い手段であることがわかりました。 HTH

特別な考え…​ テーブルにクラスタードインデックスがある場合は、SELECTステートメントにORDER BYを追加して、クラスタードインデックスと同じ順序で新しいテーブルに挿入されるようにします。 これにより、インデックス作成が大幅にスピードアップします。


0


関連するフィールドにインデックスを(適切な順序で)設定できます。例:endtimekeyとendtime。 これの多くに期待しないでください。 他に確認できるのは、クエリ結果を制限するための制約が他にあるかどうかです。

また、すべてのtabletoupdate.endtimeキーに対して正しいdate_noを返すビューを作成することもできます。

dbmsがそのようなものをサポートしていれば、おそらくストアドプロシージャを書くことができます - これは本当に更新を加速するからです。


0


ここでいくつかのことに注意してください、EndTimeKeyは本当に重要なのですか? もしそうであればそれはそれにインデックスを持っているかもしれません、もしそうであればスピード(またはその欠如)はインデックスも更新しながらデータの実際の更新もしているでしょう、解決策インデックスを落とし、インデックスを再適用する更新を実行します。

もう一つの問題はSqlのトランザクション的な性質かもしれません - あなたがこの更新をするときそれは失敗の場合にそれがロールバックできるようにすべての変更を記録するでしょう。 このアップデートはかなり簡単に見えるので、バッチで適用することができます。

TableToUpdateを更新します。setEndTimeKey = DATE_NO from EndTime = DATEここで、TableToUpdateIdは1から100000の間です。

それはあなたの更新を扱いやすいサイズの塊に分割するでしょう - 少なくとも、各塊がどれくらいかかるかという考えを得るでしょう。

もう1つの選択肢は、EndTime列にインデックスを付けることです。潜在的には、フルテーブルスキャンを実行する必要があります。

本当の答えは、生成されているクエリプランを見ることです。 ご覧のとおり、クエリの実行速度が遅くなる理由はいくつもあります。これらは確認するための簡単なものです。