LINQ-to-SQLとストアドプロシージャ [閉まっている]


188

StackOverflowの「LINQの初心者向けガイド」の投稿を見てみました(LINQの初心者向けガイド))を見てみましたが、次の質問がありました。

データベースの操作のほとんどすべてがかなり単純なデータ取得になる新しいプロジェクトを立ち上げようとしています(すでにデータを書き込んでいるプロジェクトの別のセグメントがあります)。これまでの他のほとんどのプロジェクトでは、そのような目的でストアドプロシージャを使用しています。ただし、LINQ-to-SQLの方が理にかなっている場合は活用したいと思います。

だから、問題はこれです:LINQ-to-SQLとストアドプロシージャのどちらの方法が優れているかという単純なデータ取得の場合?特定のプロまたはデメリットはありますか?

ありがとう。

回答:


192

LINQのsprocに対するいくつかの利点:

  1. 型安全性:私たちは皆、これを理解していると思います。
  2. 抽象化:これは特にLINQ-to-Entitiesに当てはまります。この抽象化により、フレームワークは、簡単に利用できる改善を追加できます。 PLINQは、マルチスレッドサポートをLINQに追加する例です。このサポートを追加するためのコード変更は最小限です。単純にsprocsを呼び出すこのデータアクセスコードを実行するのははるかに困難です。
  3. デバッグサポート:任意の.NETデバッガーを使用してクエリをデバッグできます。sprocを使用すると、SQLを簡単にデバッグすることができず、その経験は主にデータベースベンダーに関連付けられています(MS SQL Serverはクエリアナライザーを提供していますが、それだけでは十分ではありません)。
  4. ベンダーにとらわれない:LINQは多くのデータベースで機能し、サポートされるデータベースの数は増えるだけです。構文や機能のサポートが異なるため(データベースでsprocがまったくサポートされている場合)、Sprocはデータベース間で常に移植できるとは限りません。
  5. 展開:他の人はこれについて既に述べていますが、sprocのセットを展開するよりも、単一のアセンブリを展開する方が簡単です。これは#4とも関連しています。
  6. より簡単:データアクセスを行うためにT-SQLを学習する必要はありません。また、sprocsの呼び出しに必要なデータアクセスAPI(ADO.NETなど)を学習する必要もありません。これは、#3と#4に関連しています。

LINQ対sprocsのいくつかの欠点:

  1. ネットワークトラフィック:LINQがクエリ全体を送信する間、sprocはsproc-nameと引数データをネットワーク経由でシリアル化するだけで済みます。クエリが非常に複雑な場合、これは本当に悪くなる可能性があります。ただし、LINQの抽象化により、Microsoftはこれを徐々に改善することができます。
  2. 柔軟性が低い:Sprocはデータベースの機能セットを最大限に活用できます。LINQは、そのサポートにおいてより一般的な傾向があります。これは、あらゆる種類の言語抽象化(C#とアセンブラーなど)で一般的です。
  3. 再コンパイル:あなたは、データアクセスを行う方法に変更を加える必要がある場合は、再コンパイルバージョン、およびあなたのアセンブリを再デプロイする必要があります。ストアドプロシージャはでき時に再デプロイの何もしなくてもチューニングするDBAにデータ・アクセス・ルーチンを可能にします。

セキュリティと管理性も人々が議論しているものです。

  1. セキュリティ:たとえば、テーブルへのアクセスを直接制限して機密データを保護し、ACLをSprocに置くことができます。ただし、LINQを使用すると、テーブルへの直接アクセスを制限し、代わりにACLを更新可能なテーブルビューに配置して、同様の目的を達成できます(データベースが更新可能なビューをサポートしている場合)。
  2. 管理性:ビューを使用すると、スキーマの変更(テーブルの正規化など)からアプリケーションを保護するという利点もあります。データアクセスコードを変更せずにビューを更新できます。

以前は大きなsprocの人でしたが、一般的にはより良い代替手段としてLINQに傾倒し始めています。sprocの方が明らかに優れている領域がある場合は、おそらくsprocを作成しますが、LINQを使用してアクセスします。:)


32
「LINQは多くのデータベースで機能します」しかし、LINQTOSQLはSQL Serverのみをサポートします。
RussellH 2008

7
LINQ to Entitiesは、MSSQLに加えてPostgresとMySqlでも動作します。確かではありませんが、Oracleの周りに何かがあると読んだと思いました。
bbqchickenrobot 2009

devart dotConnectにはOracleの機能がありますが、地獄のようにバグがあります。また、更新するためにデータベースからデータを選択する必要があるために発生するパフォーマンスの不足を克服することはできません(Attach()も可能ですが、かなり面倒です)
Ed James

5
ここでコードの再利用について言及している人を見たことがありません。linqをVB6、asp、またはファイルメーカープロアプリで再利用することはできません。データベースに何かを入れれば、それはどこでも再利用できます。linqを使用してdllを作成することはできると思いますが、それは過度に複雑でくだらないimoになっています。再利用できる関数またはストアドプロシージャの追加は、はるかに簡単です。
MikeKulls

TSQLでのコードの再利用と言えば(1)動的SQLに頼らずにストアドプロシージャの結果を一時テーブルに保存しようとする幸運。(2)すべてのプロシージャ/関数を整理するためにできることはあまりありません。名前空間はすぐに乱雑になります。(3)強力なselectステートメントを作成しましたが、ユーザーが並べ替えられる列を選択できるようにしたい-TSQLでは、並べ替え可能な各列に対してrow_numberを実行するCTEを使用する必要がある場合があります。LINQではif、後のいくつかのステートメントで解決できます。
スペアバイト2013

77

私は、DBAが何年にもわたって懸命に取り組んできたすべての理由から、一般にすべてをストアドプロシージャに入れることを支持しています。Linqの場合、単純なCRUDクエリを使用してもパフォーマンスに違いはありません。

ただし、この決定を行うときは、いくつかの点に注意してください。ORMを使用すると、データモデルに密接に結び付けられます。DBAは、コンパイルされたコードを変更せずにデータモデルを変更する自由がありません。ストアドプロシージャを使用すると、プロシージャから返されるパラメータリストと結果セットがそのコントラクトを表すので、エクステントにこれらの種類の変更を隠すことができます。また、コントラクトが満たされている限り、内部は変更できます。 。

また、Linqをより複雑なクエリに使用する場合、データベースのチューニングははるかに困難な作業になります。ストアドプロシージャの実行速度が遅い場合、DBAは完全に独立してコードに集中でき、多くのオプションがあります。そのため、契約が完了しても契約は満たされます。

デプロイされたコンパイル済みコードを変更せずに、ストアドプロシージャのスキーマとコードを変更することで、アプリケーションの深刻な問題に対処する多くのケースを見てきました。

多分、hybirdアプローチはLinqでいいでしょうか?もちろん、Linqを使用してストアドプロシージャを呼び出すこともできます。


9
無視した機能の1つはセキュリティです。Linqでは、テーブルをアプリケーションに直接公開する必要があります。ストアドプロシージャを使用すると、これらのプロシージャへのアクセスを制限し、ビジネス要件を適用できます。
NotMe 2008年

19
「DBAは、コンパイルされたコードを変更せずにデータモデルを変更する自由がありません。」なぜこれを主張するのですか?誰もが変更を加えるための「自由」を持つべきではありません。それが構成管理のポイントです。変更は、デプロイに関係なく、開発、テストなどを通過する必要があります。
ニールバーンウェル

6
@ニール:はい。ただし、開発者にコードの変更を強制せずに開発環境を変更することはできません。
アダムロビンソン

37
データベースとの密結合についての議論はたくさんありますが、実際にそれが有効であるかどうかはわかりません。とにかくコードを高く変更する必要のないデータベースを変更したい(些細な例を超えて)状況に実際に遭遇したことはありません。そして実際、Linqはストアドプロシージャやパラメーター化されたクエリとはどう違うのですか。データアクセスレイヤーは、ORMを使用するか、より単純なものを使用するかに関係なく、適切に分離および抽象化する必要があります。それが疎結合を与えるものであり、使用するテクノロジーではありません。Just my 2c
Simon P Stevens

7
SPのシグネチャによってアプリケーションから保護された1つのスキーマ変更ごとに199のストアドプロシージャが不必要に書き込まれるのを見てきましたが、Simon P Stevensが言ったことと同様に、SPの使用法の意味上の変更には、アプリケーションの100%の変更が必要でした。とにかく時間。SPの存在自体が、将来の開発者やdbaに、ビジネスロジックをSPにリークするように頼むという事実は言うまでもありません。それからもう少し、そしてもう少し。

64

LinqからSql。

SQLサーバーはクエリプランをキャッシュするため、sprocのパフォーマンスは向上しません。

一方、linqステートメントは論理的にアプリケーションの一部であり、アプリケーションでテストされます。Sprocは常に少し離れており、保守とテストが困難です。

今、新しいアプリケーションをゼロから作成している場合は、sqsではなくLinqを使用します。


8
sprocsの利益がないというあなたのコメントについては同意しません。私は製品システムでのSQL Serverアクセス​​への一連のアプローチをプロファイルしました。Prepare+ストアドプロシージャを使用すると、最良の結果が得られました。同じロジックの複数の呼び出し間でも。たぶん、あなたは使用量の少ないDBを使用しています。
チュートリアル

最も熟練したデータベースクエリ開発者である場合は、最も親しみのあるものを使用してください。手続き型コードとは異なり、「正しい答えが得られれば出荷する」とは言えません。
dkretz 2008

5
@RussellH:これは.Net 3.5にも当てはまり、.Net 4(L2Sと
L2Eの

3
@キースはそうではありません!LinqからはSPよりも多くの実行プランが作成されます。デバッグするコードには利点があります。しかし、会社の展開サイクルのための再コンパイルに問題があります。さまざまなACTIONクエリ、WHERE、ORDER BYをテストする柔軟性がありません。WHEREステートメントの順序を変更すると、別のクエリが処理される可能性があります。プリフェッチ; これはLinqでは簡単に実行できません。微調整に使用できるデータレイヤーが必要です。SPの保守とテストは難しいですか?あなたがそれに慣れていない場合; しかし、SPは軍団やVLDB、高可用性などに有益です!Linqは小規模なプロジェクト、単独作業用です。頑張れ。
SnapJag 2010

4
@SnapJag-sprocを使用すると、きめ細かい制御が可能になりますが、実際には、99%の時間(私が作業している大規模なエンタープライズシステムであっても)に追加の最適化は必要ありません。Sprocは、使い慣れているかどうかを維持およびテストするのが困難です-私は使い慣れており(私は開発者になる前はDBAでした)、さまざまなテーブルのロードに対する各CRUD操作のsprocが最新のものは苦痛です。ベストプラクティス(IMHO)は、最も簡単な方法でコーディングし、パフォーマンスチェックを実行して、必要な場所のみを最適化することです。
キース

40

基本的なデータ検索のために、私はためらうことなくLinqに行きます。

Linqに移行して以来、次のような利点があります。

  1. DALのデバッグがこれまでになく簡単になりました。
  2. スキーマが変更された場合の時間の安全性をコンパイルすることは非常に貴重です。
  3. すべてがDLLにコンパイルされるため、展開が簡単です。配置スクリプトを管理する必要はもうありません。
  4. LinqはIQueryableインターフェイスを実装するすべてのクエリをサポートできるため、同じ構文を使用して、XML、オブジェクト、およびその他のデータソースをクエリできます。新しい構文を学ぶ必要はありません。

1
私にとって、コンパイル時の安全性が重要です!
bbqchickenrobot 2009

ただし、展開の場合、展開サイクルがあり、すぐに解決する必要のあるバグが存在する企業チームの場合、QAなどによるDLLの展開は、単一のデータベースの展開へのパスよりも厳格です。脚本。あなたの利点は、小さなチーム/プロジェクトのシナリオをよりよく表すようです。
SnapJag 2010

3
QAを通過する必要のないSQLスクリプトの配備は、ここでは必ずしも良いことではありません。
リアン

27

LINQはプロシージャキャッシュを膨らませます

アプリケーションがLINQ to SQLを使用していて、クエリに長さが非常に可変である可能性がある文字列の使用が含まれている場合、SQL Serverプロシージャキャッシュは、文字列の長さごとに1つのバージョンのクエリで肥大化します。たとえば、AdventureWorks2008データベースのPerson.AddressTypesテーブルに対して作成された次の非常に単純なクエリについて考えてみます。

var p = 
    from n in x.AddressTypes 
    where n.Name == "Billing" 
    select n;

var p = 
    from n in x.AddressTypes 
    where n.Name == "Main Office" 
    select n;

これらのクエリの両方を実行すると、SQL Serverプロシージャキャッシュに2つのエントリが表示されます。1つはNVARCHAR(7)でバインドされ、もう1つはNVARCHAR(11)でバインドされます。ここで、長さがすべて異なる、数百または数千の異なる入力文字列があった場合を想像してください。プロシージャキャッシュは、まったく同じクエリに対して、あらゆる種類の異なるプランで不必要にいっぱいになる可能性があります。

詳細:https : //connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290


10
なんてばかげた議論です-変数を使うだけで問題は解決します。
JohnOpincar、2009年

6
@John、最後にリテラル文字列をデータベースに送信しているため、リテラル文字列の代わりに検証を使用した場合は役に立ちません。コードでは変数のように見えるかもしれませんが、DBに送信されるのは生成されたT-SQLの文字列です。
kay.one 2009

15
SQLMenace:リンク先のページによると、この問題はVS2010で解決されています。
Mark Byers、2010

8
この問題は回答が投稿された時点では有効でしたが、その後VS2010で解決されたため、問題ではなくなりました。
Brain2000

17

プロLINQの議論は、データベース開発の歴史を持たない人々(一般)から来ているように思われます。

特にVS DB ProやTeam Suiteなどの製品を使用している場合、ここで行われた引数の多くは適用されません。たとえば、次のようになります。

保守とテストが難しい:VSは、完全な構文チェック、スタイルチェック、参照チェックと制約チェックなどを提供します。また、完全な単体テスト機能とリファクタリングツールも提供します。

LINQは、ACIDテストに失敗するため(私の考えでは)、真のユニットテストを不可能にします。

LINQでのデバッグが容易に:なぜですか?VSでは、マネージコードからの完全なステップインと、SPの定期的なデバッグが可能です。

展開スクリプトではなく、単一のDLLにコンパイルされます。VSは、完全なデータベースを構築して展開したり、データセーフな増分変更を行ったりすることができるので、助けになります。

LINQでTSQLを学ぶ必要はありません:いいえ、必要ありませんが、LINQを学ぶ必要があります-利点はどこにありますか?

私はこれが利益になるとは本当に思っていません。分離して何かを変更できることは理論的には良さそうに聞こえるかもしれませんが、変更が契約を履行するからといって、それが正しい結果を返すわけではありません。正しい結果を判断するには、コンテキストが必要であり、そのコンテキストを呼び出しコードから取得します。

疎結合のアプリは、柔軟性を向上させる優れたプログラマーの究極の目標です。物事を個別に変更できることは素晴らしいことであり、適切な結果が返されることを保証するのはユニットテストです。

皆さんが動揺する前に、LINQにはその地位があり、大きな未来があると思います。しかし、複雑でデータ集約型のアプリケーションの場合、ストアドプロシージャに代わる準備ができているとは思いません。これは、今年のTechEdのMVPによって私が反響を呼んだ見解でした(これらは無名のままです)。

編集:物事のLINQ to SQLストアドプロシージャ側は、私がまだもっと読む必要があるものです-私が見つけたものに応じて、上記のダイアトリブを変更するかもしれません;)


4
LINQを学ぶことは大したことではありません-それは単に構文上の砂糖です。TSQLは完全に異なる言語です。リンゴとオレンジ。
Adam Lassek、

3
LINQを学習する利点は、それが単一のテクノロジーに結び付けられていないことです。クエリのセマンティクスはXMLやオブジェクトなどに使用でき、これは時間の経過とともに拡大します。
Dave R.

5
同意しました!非常に多くの人々(開発者)が、小規模なチームやプロジェクトで「市場に投入するまでの」ソリューションを探しています。しかし、開発が複数のチーム、大規模データベース、大容量、高可用性、分散システムを備えた次のレベルの企業スタイルに進んでいる場合、LINQを使用するのは別の話になります。あまりにも長い間、あなたの意見を編集する必要があるとは思いません。LINQは、大規模で複数の人、複数のチーム(DevとDBA)がいて、厳密な展開スケジュールがあるプロジェクト/チーム用ではありません。
SnapJag 2010

17

LINQは新しく、その場所を持っています。LINQは、ストアドプロシージャを置き換えるために発明されたものではありません。

ここでは、 "LINQ to SQL"についてのみ、いくつかのパフォーマンスの神話と短所に焦点を当てますが、もちろん完全に間違っているかもしれません;-)

(1)LINQステートメントはSQLサーバーに「キャッシュ」できるため、パフォーマンスが低下しないと人々は言っています。部分的に正しい。「LINQ to SQL」は、実際にはLINQ構文をTSQLステートメントに変換するランタイムです。したがって、パフォーマンスの観点からは、ハードコーディングされたADO.NET SQLステートメントはLINQと違いはありません。

(2)例として、カスタマーサービスのUIには「口座振替」機能があります。この関数自体が10個のDBテーブルを更新し、いくつかのメッセージを一度に返す場合があります。LINQでは、一連のステートメントを作成し、それらを1つのバッチとしてSQLサーバーに送信する必要があります。この変換されたLINQ-> TSQLバッチのパフォーマンスは、ストアドプロシージャとほとんど一致しません。理由?組み込みのSQLプロファイラーと実行プランツールを使用して、ストアドプロシージャのステートメントの最小単位を微調整できるため、これをLINQで行うことはできません。

重要なのは、単一のDBテーブルと小さなデータCRUDのセットを通信する場合、LINQはSPと同じくらい高速であることです。ただし、はるかに複雑なロジックの場合、ストアドプロシージャの方がパフォーマンスを調整できます。

(3)「LINQ to SQL」は、初心者がパフォーマンスの独創性を導入することを簡単にします。上級TSQLの人なら誰でも、CURSORを使用しない方がいいでしょう(基本的に、TSQLでCURSORを使用すべきではありません)。LINQとクエリを使用した魅力的な "foreach"ループにより、初心者がそのようなコードを記述するのは非常に簡単です。

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

この簡単なまともなコードは非常に魅力的であることがわかります。しかし、内部では、.NETランタイムはこれを更新バッチに変換します。500行しかない場合、これは500行のTSQLバッチです。100万行ある場合、これはヒットです。もちろん、経験豊富なユーザーはこの方法を使用してこの作業を行うことはありませんが、要点は、このように陥りやすいことです。


2
C / C ++ / C#のポインターで失敗するのは簡単ですが、使用しないでください。
bbqchickenrobot 2009

1
ポインターを扱う中級レベルのプログラマーは何人いますか?Linqはこの機能をあらゆるレベルのコーダーに公開しているため、エラーのリスクが大幅に増加します。
ジャック

1
LINQの初心者と上級TSQLの人を比較しています。それほど公平な比較ではありません。私はあなたのコードに同意します、LINQは一般的にバッチ更新/削除に対してパフォーマンスが良くありません。しかし、私はLINQとSP間の性能の引数のほとんどを主張、主張しているが、指標に基づいていない

12

最高のコードはコードではなく、ストアドプロシージャでは、少なくともそれを呼び出すためにデータベースとアプリケーションでコードを記述する必要がありますが、LINQ to SQLまたはLINQ to Entitiesでは、追加のコードを記述する必要はありませんコンテキストオブジェクトのインスタンス化を除いて、他のLINQクエリを超えるコード。


10

LINQは間違いなく、アプリケーション固有のデータベースや小規模ビジネスでその位置を占めています。

しかし、中央データベースが多くのアプリケーションの共通データのハブとして機能する大企業では、抽象化が必要です。セキュリティを一元管理し、アクセス履歴を表示する必要があります。影響分析を実行できる必要があります。新しいビジネスニーズに対応するためにデータモデルに小さな変更を加える場合、どのクエリを変更する必要があり、どのアプリケーションを再テストする必要がありますか?ビューとストアドプロシージャは私にそれを与えます。LINQがそれをすべて実行できるようになり、プログラマーの生産性を向上させることができれば、歓迎します。このような環境で使用した経験がある人はいますか?


2
あなたは良い点を育てます。この場合、LINQは代替手段ではありません。
Meta-Knight

1
さまざまなアプリケーションがすべて共通のデータアクセスレイヤーを使用している必要があります(もちろん、常にそうであるとは限りません)。その場合は、共通ライブラリに1つの変更を加えて再デプロイできます。WCFなどを使用してデータアクセスを処理することもできます。技術的にlinqを使用して舞台裏のデータにアクセスできる優れた抽象化レイヤーがあります。それはすべて、SPとLinqの使用に関して、あなたの要件に対してあなたが何を考え出したかに依存していると思います。
bbqchickenrobot 2009

8

DBAは、コンパイルされたコードを変更せずにデータモデルを変更する自由がありません。ストアドプロシージャを使用すると、プロシージャから返されるパラメータリストと結果セットがそのコントラクトを表すので、エクステントにこれらの種類の変更を隠すことができます。また、コントラクトが満たされている限り、内部は変更できます。 。

私はこれが利益になるとは本当に思っていません。分離して何かを変更できることは理論的には良さそうに聞こえるかもしれませんが、変更が契約を履行するからといって、それが正しい結果を返すわけではありません。正しい結果を判断するには、コンテキストが必要であり、そのコンテキストを呼び出しコードから取得します。


7

IMHO、RAD = LINQ、RUP =ストアドプロシージャ。私は長年にわたってフォーチュン500の大企業で管理職を含むさまざまなレベルで働いていましたが、率直に言って、RAD開発を行うためにRUP開発者を雇うことは決してありませんでした。彼らはサイロ化されているため、プロセスの他のレベルで何をすべきかについての知識は非常に限られています。サイロ化された環境では、非常に具体的なエントリポイントを通じてDBAがデータを制御できるようにするのが理にかなっています。他の人は率直に言って、データ管理を行う最善の方法を知らないからです。

しかし、大企業は、移動痛々しい開発の分野では遅い、これは非常に高価です。時間とお金の両方を節約するために、より速く移動する必要がある場合があります。LINQは、それだけでなく、さらに多くのことを提供します。

DBAは仕事の安全を脅かすと感じているため、LINQに偏っていると思うことがあります。しかし、それは獣、女性、紳士の性質です。


3
ええ、私たちのDBAは、Stored Procの本番へのプッシュをリクエストするのを一日中待っています。それをしなければならないことは私たちの心を壊すでしょう!
サム

6

私はあなたが現実のもののためにprocsに行く必要があると思います。

A)すべてのロジックをlinqで記述すると、アプリケーションだけが使用できるため、データベースの有用性が低下します。

B)とにかく、オブジェクトモデリングがリレーショナルモデリングよりも優れているとは思いません。

C)SQLでのストアドプロシージャのテストと開発は、Visual Studio環境でのコンパイル編集サイクルよりもはるかに高速です。F5を編集して、選択を押すだけで、レースに参加できます。

D)ストアドプロシージャの管理と展開は、アセンブリよりも簡単です。ファイルをサーバーに置き、F5キーを押すだけです。

E)SQLへのLinqは、予期しないときでも、くだらないコードを書き込みます。

正直なところ、私は、MSがlinqのように暗黙的に結合予測を実行できるように、MSがt-sqlを拡張することが最終的なものになると思います。たとえば、t-sqlは、order.lineitems.partを実行するかどうかを知っている必要があります。


5

LINQは、ストアドプロシージャの使用を禁止していません。LINQ-SQLとLINQ-storedprocで混合モードを使用しました。個人的には、ストアドプロシージャ.... pwet-tuを記述する必要がないことをうれしく思います。


4

また、可能な2.0ロールバックの問題もあります。数回私に起こったことを信じてください、それで他の人にも起こったと確信しています。

また、抽象化が最高であることにも同意します。事実とともに、ORMの本来の目的は、RDBMSをOOの概念にうまく適合させることです。ただし、すべてがOOの概念から少し逸脱する必要があるためにLINQの前に問題なく機能した場合は、問題が発生します。概念と現実は必ずしもうまく一致するとは限りません。ITには好戦的な狂信者を受け入れる余地はありません。


3

私はあなたがLinq To Sqlを意味していると思います

CRUDコマンドを使用する場合は、ストアドプロシージャとテクノロジのパフォーマンスを簡単に比較できます。この場合、2つの間の違いは無視できます。100,000を超える選択クエリの5(単純型)フィールドオブジェクトをプロファイリングして、実際の違いがあるかどうかを確認してください。

一方、本当の契約解除者は、ビジネスロジックをデータベースに置くことに抵抗がないかどうかという問題です。これは、ストアドプロシージャに対する反対論です。


1
アプリケーションよりも多くの場所がデータに影響を与える可能性があるため、データインポート、他のアプリケーション、直接クエリなど、データベースにビジネスロジックを配置しないのは愚かです。ただし、データの整合性が問題にならない場合は、先に進んでください。
HLGEM 2008

3
ビジネスロジックはデータベースに入れるべきではありません。デバッグと管理が容易なプログラミング言語である必要があります。その後、アプリケーション間でオブジェクトとして共有できます。一部のルールはデータベースにあるが、ビジネスロジックにはない場合があります。
4thSpace

3

教祖によると、私はLINQをオートバイ、SPを車と定義しています。短い旅行に行きたいが、乗客が少ない(この場合は2)場合は、LINQで優雅に行ってください。でも、旅に出て大きなバンドを持ちたいなら、SPを選ぶべきだと思います。

結論として、オートバイと車のどちらを選択するかは、ルート(ビジネス)、長さ(時間)、乗客(データ)によって異なります。

それが役に立てば幸い、私は間違っているかもしれません。:D


1
友達がバイクに乗って亡くなりました:P
Alex

2
車を運転している人も亡くなりました。
リアン

1
はい、あなたは間違っています。
アサドアリ2017

3

LINQに傾いたこれらすべての答えは主に、コーディングの質の悪さやコーディングの怠惰に多少関係している開発の容易さについて話しています。それだけみたいです。

いくつかの利点またはLinq、私はここで、テスト、デバッグなどが簡単であると読みますが、これらは最終出力やエンドユーザーに接続されていません。これは常に、エンドユーザーのパフォーマンスの問題の原因になります。メモリに多くのものを読み込んでから、LINQを使用する際にフィルターを適用するポイントは何ですか?

ここでもTypeSafetyは、「間違った型キャストを回避するように注意しています」という警告であり、linqを使用して改善しようとしている低品質です。その場合でも、文字列列のサイズなど、データベース内の何かが変更された場合、linqを再コンパイルする必要があり、それがないと型保証されません。

LINQを使用しているときに良い、甘い、面白いなどが見つかりましたが、開発者を怠惰にするという非常に不利な点があります:)そして、ストアドプロシージャと比較してパフォーマンスが悪い(最悪かもしれません)と1000倍証明されています。

怠惰にならないでください。一生懸命頑張っています。:)


4
すべてをメモリにロードしてフィルタリングしますか?Linqはクエリの一部としてフィルターをデータベースに送信し、フィルターされた結果セットを返します。
リャン2013

LINQがすべてのデータを読み込み、foreachループを使用して処理すると信じている人はかなりいます。それは間違っている。SQLクエリにコンパイルされ、ほとんどのCRUD操作に対してほぼ同じパフォーマンスを提供します。しかし、はい、それは特効薬ではありません。T-SQLまたはストアドプロシージャを使用した方が良い場合があります。
それはトラップである

私は反論の両方に同意します。ただし、linqがすべてのフィルターをDBMSに送信してそれを処理することは完全には当てはまりません。メモリで機能するものはいくつかありますが、そのうちの1つは異なります。
マニッシュ

2

単一のデータアクセスポイントを使用する単純なCRUD操作の場合、構文に慣れていれば、LINQを使用すると思います。より複雑なロジックについては、T-SQLとそのより高度な操作が得意であれば、sprocの方がパフォーマンス面で効率的だと思います。また、Tuning Advisor、SQL Server Profiler、SSMSからのクエリのデバッグなども利用できます。


2

ストアドプロシージャを使用すると、テストが容易になり、アプリケーションコードに手を加えることなくクエリを変更できます。また、linqでは、データを取得しても、そのデータが適切であるとは限りません。データの正当性をテストすることは、アプリケーションを実行することを意味しますが、ストアドプロシージャを使用すると、アプリケーションに触れずに簡単にテストできます。


1

結果は次のように要約できます。

小規模サイト用のLinqToSql、およびプロトタイプ。プロトタイピングの時間を本当に節約します。

Sps:ユニバーサル。クエリを微調整し、常にActualExecutionPlan / EstimatedExecutionPlanを確認できます。



0

LINQとSQLの両方に場所があります。どちらにも欠点と利点があります。

複雑なデータを取得するために、ストアドプロシージャが必要になる場合があります。また、Sql Server Management Studioでストアドプロシージャを他のユーザーに使用させたい場合があります。

Linq to Entitiesは、迅速なCRUD開発に最適です。

もちろん、どちらか一方のみを使用してアプリを構築できます。またはそれを混ぜることができます。それはすべてあなたの要求に帰着します。しかし、SQLストアドプロシージャがすぐになくなることはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.