SQL、Whileループ、再帰的ストアドプロシージャ、またはカーソルのどちらが高速ですか?ストアドプロシージャのいくつかの場所でパフォーマンスを最適化したい。私が最適化しているコードは、ファイルに出力するためにいくつかの文字列をフォーマットします。
SQLServerを使用していると仮定します。
まず第一に、誰かがステートメントで言ったように、再帰的なストアドプロシージャは、可能ではありますが、スタックサイズのため、SQLServerではお勧めできません。したがって、深く再帰的なロジックは壊れます。ただし、ネストのレベルが2〜3レベルである場合は、再帰を使用するか、 [〜#〜] cte [〜#〜] を使用してみてください。これも少し再帰的です(SQL Server 2005以上)。頭をCTEに巻き付けることができたら、それは非常に便利なテクニックです。私は測定していませんが、CTEを使用したいくつかの場所でパフォーマンスの問題が発生したことはありません。
一方、カーソルはパフォーマンスを大幅に低下させるため、私( およびインターネットの半分 )は、頻繁に呼び出されるコードではカーソルを使用しないことをお勧めします。しかし、カーソルはC#のforeach
に似た、より古典的なプログラミング構造であるため、複雑な複数内部よりも、データ操作にカーソルを使用するSQLコードを確認、理解、および保守する方が簡単だと感じる人もいます。 SQL怪物を選択するので、たまに呼び出されるコードでそれらを使用することは最悪の考えではありません。
while
と言えば、プログラミングの考え方をセットベースの考え方からプロシージャベースの考え方に移行するため、比較的高速で多くのリソースを消費しませんが、データ数を劇的に増やすことができます。データベース自体に発行する操作ステートメント。
要約すると、パフォーマンスが最優先される複雑なストアドプロシージャを作成する必要がある場合は、次のことを試してみます。
その順番で。
コードの使用頻度がはるかに少ない場合は、おそらく1と2の前に3と4を移動しますが、繰り返しになりますが、多くのテーブルと多くのリレーションを使用する複雑なシナリオの場合のみです。もちろん、YMMVなので、実際のシナリオで行った手順をテストして、実際にパフォーマンスを測定します。なぜなら、これについては青くなるまで話すことができるので、これは速くて遅いですが、実際の測定値が得られますが、変更によって状況が改善されているか悪化しているかを判断する方法はありません。
そして、忘れないでください、コードはあなたのデータと同じくらい速いだけです。優れたインデックス作成に代わるものはありません。
D)上記のいずれでもない。
セットベースの方法は、ほとんどの場合、最速の方法です。実際のコードが何であるか(または近似値)がわからなければ、それが可能かどうか、またはどの方法が最速であるかを判断するのは困難です。
あなたの最善の策は、あなたが持っているすべての可能な方法をテストし、どれが本当に最速であるかを確認することです。
カーソルとそれらを回避する方法 を見てください。これにより、カーソルをSETベースの操作に置き換える方法がわかります。
パフォーマンスを向上させたい場合は、SETベースの操作を検討する必要があります。 whileループとカーソルは基本的に同じものです。 SQLはSETで機能しますが、手続き型言語ではありません。意図された方法で使用してください。
再帰的なストアドプロシージャは最も遅くなる可能性がありますが、ループとカーソルは相互に排他的ではありません。カーソル操作は非常に高速(IME)ですが、外部(SQL以外)のコードからしか使用していません。他のポスターは正しいです。セット指向の方法で処理を行うことができれば、最高のパフォーマンスが得られます。
カーソルに関する3部構成のブログ投稿があります。時間があれば読む価値があります。私も疫病のようにそれらを避けますが、このブログは私にそれらを別の見方で見させました...まあ...私は今それらを少し落としますが、それでもそれらを使用しません!
あなたはまだ知りませんが、あなたはこの本を読みたいと思っています。
http://www.Amazon.com/Refactoring-SQL-Applications-Stephane-Faroult/dp/0596514972