22

理論的な質問があります。

PHP ファイル内で関数を宣言することと、データベース内で同じことを行うストアド プロシージャを作成することの間に違いは見当たりません。

たとえば、特定の国のすべての都市のリストを返すストアド プロシージャを作成する必要があるのはなぜですか? PHP関数を使用してデータベースにクエリを実行すると、同じ結果が得られるのに、なぜですか?

この場合、ストアド プロシージャを使用する利点は何ですか? またはどちらが良いですか?データベース内で PHP またはストアド プロシージャの関数を使用するには? そして、2つの違いは何ですか?

ありがとうございました。

4

4 に答える 4

29

いくつかの利点は次のとおりです。

  • 保守性: app1、app2、app3 の呼び出しを編集しなくても、プロシージャ内のロジックを変更できます。

  • セキュリティ/アクセス制御: 誰がどのテーブルまたはどのテーブル行にアクセスできるかを制御するよりも、事前定義されたプロシージャを誰が呼び出すことができるかを心配する方が簡単です。

  • パフォーマンス: アプリが DB と同じサーバーに配置されておらず、実行していることに複数のクエリが含まれる場合、プロシージャを使用すると、データベースへの呼び出しを 1 回にすることでネットワーク オーバーヘッドを削減できます。クエリ。

  • パフォーマンス (2): 通常、プロシージャのクエリ プランはキャッシュされるため、再準備する必要なく何度でも再利用できます。

(あなたの特定の例の場合、メリットは明らかにゼロです。)

于 2013-06-25T21:35:34.570 に答える
6

簡単な答えは、コードを移植可能にしたい場合は、ストアド プロシージャを使用しないことです。たとえば、MySQL から PostgreSQL にデータベースを変更したい場合は、作成したすべてのストアド プロシージャを更新/移植する必要があるためです。

一方、ストアド プロシージャを使用すると、すべてのコードがデータベース エンジンによって実行されるため、パフォーマンスが向上する場合があります。また、ストアド プロシージャが不適切に使用されると、状況が悪化する可能性があります。

国を選択することは非常に高価な操作だとは思いません。したがって、この場合、ストアド プロシージャを使用する必要はないと思います。

于 2013-06-25T21:35:22.537 に答える
4

ほとんどの人がすでに説明しているように、それでも私は自分のやり方で繰り返します

ストアド プロシージャ:
ロジックはデータベースに存在します。
実行する必要があるクエリを考えてみましょう。次のいずれかの方法で実行できます。

  • クライアントからデータベースサーバーにクエリを送信し、そこで解析、コンパイル、実行します。
  • もう 1 つの方法は、クエリをデータベース サーバーに配置し、クエリのエイリアスを作成することです。これにより、クライアントは要求をデータベース サーバーに送信し、サーバーで受信すると実行されます。


    クライアント---------------------------------------------- --------------> サーバー

    従来型 :
    @Client で作成されたクエリ ---------- その後、サーバーに伝播 ---------- クエリ : サーバーに到達: 解析、コンパイル、実行。

    ストアド プロシージャ:
    エイリアスが作成され、クライアントで使用されます-----その後、サーバーに伝播-------- サーバーで到達したエイリアス: 解析、コンパイル、キャッシュ (for最初の時間)
    次に同じエイリアスが表示されたときに、クエリ実行可能ファイルを直接実行します。

    利点:

  • ネットワーク トラフィックの削減: クライアントが大きなクエリを送信していて、同じクエリを頻繁に使用している可能性がある場合、クエリのすべてのビットがネットワークに送信されるため、ネットワーク トラフィックが増加し、ネットワーク使用量が不必要に増加する可能性があります。

  • より高速なクエリ実行: ストアド プロシージャは一度に解析、コンパイルされ、実行可能ファイルがデータベースにキャッシュされるためです。したがって、同じクエリが複数回繰り返される場合、データベースは実行可能ファイルを直接実行するため、解析、コンパイルなどで時間が節約されます。これは、クエリが頻繁に使用される場合に適しています。クエリが頻繁に使用されない場合は、キャッシュされた実行可能ファイルを保存するとスペースが必要になるため、データベースに不必要に負荷をかける理由がよくない可能性があります。

  • モジュラー: 複数のアプリケーションが同じクエリを使用したい場合、従来の方法ではアプリケーションでコードを不必要に複製していました。コードをデータベースの近くに配置するのが最善の方法です。このようにして、重複を簡単に軽減できます。

  • セキュリティ: ストアド プロシージャも開発されており、承認 (クエリを実行する特権を持つユーザーとそうでないユーザーを意味します) を念頭に置いています。したがって、特定のユーザーに対してはアクセス許可を付与でき、他のユーザーには DBA としてアクセス許可を取り消すことができます。したがって、DBA へのポイントとして、DBA は誰がアクセス権を取得するのに適切な人物であるかを知ることができます。全て。したがって、従来の方法ではなくストアド プロシージャを使用するポイントとしてセキュリティ/承認のみがある場合、ストアド プロシージャは適切ではない可能性があります。

于 2015-05-25T11:33:49.397 に答える
3

わかりました、これは少し単純化しすぎている可能性があります (そしておそらく不完全です):

ストアド プロシージャの場合:

  1. クエリをデータベースに送信する必要はありません
  2. DBMS は毎回クエリを検証する必要はありません (構文の意味での検証など)。
  3. DBMS は毎回クエリを最適化する必要はありません (SQL は宣言型であるため、DBMS は最適化されたクエリ実行計画を生成する必要があることに注意してください)。
于 2013-06-25T21:34:27.297 に答える