2012-03-28 3 views
5

私のプロジェクトでは、ハードコードされたクエリをストアドプロシージャに変換することが始まりましたが、これを使用する利点がわかりました。ただし、ストアドプロシージャを使用しないでください特定のシナリオがありますか?ハードコードされたクエリよりもストアドプロシージャを使用する利点はいつですか?

+4

ストアドプロシージャと比較したもの> 他の代替> –

+0

は、ストアドプロシージャよりもコードのハードコーディングされたクエリ(SQL)と比較しています。 –

答えて

6

あり、主にされています私はストアドプロシージャが非常にまれな条件を除いて常に意味をなさないと思う皆に送る。彼らは一般的に、殺人犯を止めるために人を殺すことに対して法律を制定する必要があるという行に沿った誤りを挙げています。

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

上記のリンクは、ストアドプロシージャを使用するとき、およびないときは、およそ本当に良いの引数の多くを示しています。その中でも、特にC#では、フレームワークがあなたに与えるすべてのものを無視しています。メンテナンスの悪夢に賛成して、クエリーのための合理的なUI決定を持つ力という点では、

+1

データベースデザインやコンパイルされたコードなどの変更により、幾分古くなった投稿 – Lloyd

+0

ほとんどありません。それ以来、メジャーデータベースのコンパイルされたコードに変更はありません。 – TomTom

+0

@TomTomこれは12年前のSQL Serverであり、2012年の差し迫った差はありませんが、2000年から2008年のR2には大きな変化がありました。 – mattytommo

4

通常、ストアドプロシージャを使用する方が良いです。それらを使用する場合、主な利点は、ストアドプロシージャを使用してクエリを複数回実行すると、再利用のための実行計画が保持されることです。

それらを使用する利点の多くがありますが、参考のためにここを参照してください:http://blog.sqlauthority.com/2007/04/13/sql-server-stored-procedures-advantages-and-best-advantage/

編集を:記事は2007年からであるが、重要な原則は、標準的なブログと同じ

+0

この回答のキーワードは「一般的」なので、一般的にはストアドプロシージャを使用する方が良いと私は同意できませんが、一般的にはそれを使用する方が良いということに同意することができます...私はここでは、私はそうではありません。偉大な記事のリンク+1。 –

3

この質問には多くの質問が寄せられ、hereは件名の良い投稿です。

しかし、私は個人的にはストアドプロシージャの複雑なロジックを後で維持するのが難しく、それを置くのに最適な場所ではないと言います。 ORMマッパーはかなり広く使用されており、より大きなもの(Hibernate/NHIbernate、EFなど)はすべてオプトマイズクエリを生成し、優れたキャッシュ戦略を持っています。

多くの多くのprocが格納されているシステムは避けてください(私は4kを超えるprocsが格納されたシステムを見てきました。

編集

私は私の答えに拡大している必要があり、これらはサーバ自体で実行されるため、大きな用途を持っている大量のデータがする必要があるところ、今、保存されprocsのは、しかし、彼らは素晴らしいですか、そうだろう処理され、ネットワーク接続経由​​で買い戻されず、同じ結果を得るためにデータベースへのいくつかのラウンドトリップが必要な場合は、ストアドプロシージャでoptomiseする傾向があります。ほとんどのORMSはsprocを実行してマッピング結果を戻すことができます。 orm溶液の豊かさへ。

しかし、ORM経由でsprocsを排他的に実行していることがわかった場合、ormは本当に必要ありません。だから、今日はパフォーマンスのオプトマイゼーションです。大きなデータセットが関係する場所。また、デベロッパーとDBAの両方から誤解された意見や習慣が多い傾向にあり、戦争のような状態につながる可能性があります。「すべてのコードはsprocsでなければなりません」または「すべてのコードを生成する必要がありますorm "、これは愚かな状態です。

私が指摘しておかなければならないことは、私はそれらのバグのすべての種類のsprocsを見ていると私たちの自然のソフトウェア開発者は通常、私たちは思考していない傾向がないSQLを書くために"セットのような"方法。それは私たちの専門性ではない偉大なSQLコードを書くことはできません。

コードパスを一度下っていくsprocが何回目に見えますか?その次の時間にそのパスを下がらないため、結果としてプランがキャッシュされ、最適ではありません。それをたくさん見ました。

+0

遅いです。 NHibernate asetc。 - あなたの趣味によっては、BlToolkit/Linq2DBの方がはるかに速くなる可能性があります。 – TomTom

+0

Linq2Sql!= Linq2DB –

1

ベストプラクティスは、ストアドプロシージャを使用することです。

  1. 分離作業。
  2. 再利用可能(SQLから直接テストすることができます)
  3. 多くの目的で1つのプロシージャを使用すると、ソフトウェアに何らかの変更が生じた場合に時間が短縮されます。
  4. DLLの特別なプログラム内のコードを置き換える必要はありません。
+1

天気ありがとうございましたSANE te4amsは、これら4つのベストプラクティスが関連性があると考えている人々を怒らせます。 – TomTom

+0

申し訳ありませんが、この考え方は時代遅れです。 –

関連する問題