web-dev-qa-db-ja.com

MySQL:ビューとストアドプロシージャ

MySQLがストアドプロシージャのサポートを開始して以来、私は実際にそれらを使用したことはありません。私は優れたクエリライターではないため、選択を行うDBAと頻繁に連携しているため、知っていることに慣れているためです。

データ選択を行うという点で、特にデータの非正規化(結合)および集約(平均または最大、カウント付きサブクエリなど)選択である選択を検討する場合、MySQL5.xで正しい選択は何ですか? ?ビュー?またはストアドプロシージャ?

私が慣れているビュー-SELECTクエリがどのように表示されるかを知っているので、それを作成し、インデックスが付けられていることを確認してから、CREATE VIEW [View] AS SELECT [...]。次に、私のアプリケーションでは、ビューを読み取り専用テーブルとして扱います。これは、正規化されたデータの非正規化バージョンを表します。

ここでの欠点は何ですか?もしあれば?そして、まったく同じSELECTステートメントをストアドプロシージャに移動した場合、何が変わる(利益または損失)でしょうか?

このトピックをグーグルで検索している間は見つけるのが困難であった「内部」の良い情報を見つけたいと思っていますが、本当にすべてのコメントと回答を歓迎します。

30
Peter Bailey

私の意見では、ストアドプロシージャは、同じルーチンを複数の異なるアプリケーション間で使用する必要がある場合、またはデータベースやテーブル間のETLに使用する必要がある場合にのみ、データ操作に使用する必要があります。基本的に、DRYの原則にぶつかるまで、またはDB内のある場所から別の場所にデータを移動するだけになるまで、できるだけ多くのコードを実行します。

ビューを使用して、データに代替または簡略化された「ビュー」を提供できます。そのため、別の表示方法を見つけるほどデータを操作しているわけではないので、私は見解を持って行きます。

12
Chris Johnston

非正規化または出力フォーマットにはビューを使用し、フィルタリングとデータ操作(パラメーター入力が必要なもの)または反復(カーソル)にはストアドプロシージャを使用します。

非正規化とフィルタリングの両方が必要な場合、ストアドプロシージャ内のビューにアクセスすることがよくあります。

5
Chris Nava

それがどちらかまたは両方の選択であるかどうかわからない。ストアドプロシージャは、ビューが苦労するさまざまなことを実行できます(一時テーブルにデータを入力し、その上でカーソルを実行してから、集計を実行して結果セットを返すことを考えてください)。

一方、ビューは複雑なSQL /アクセス権を非表示にし、スキーマの変更されたビューを表示できます。

どちらも物事のスキームに位置づけられており、スキーマの実装を成功させるのに役立つと思います。

4
Learning

注意すべき点の1つは、少なくともmysqlビューの結果は一時テーブルに格納され、ほとんどの適切なデータベースエンジンとは異なり、このテーブルにはインデックスが付けられないため、クエリを単純化するために使用する場合、プログラムがすべてを取得するときにビューが最適です。ビューからの結果ですが、パラメータに基づいてそのビューの結果を検索すると、特に何百万ものレコードをふるいにかける場合は非常に遅くなり、ビューが他のビューの上に構築されている場合はさらに悪化します。

ただし、ストアドプロシージャでは、これらの検索パラメータを渡して、下線付き(インデックス付き)テーブルに対して直接クエリを実行できます。欠点は、プロシージャを実行するたびに結果をフェッチする必要があることです。これは、サーバーの構成によっては、ビューでも発生する可能性があります。

したがって、基本的に、ビューを使用する場合は結果の数を最小限に抑えようとする場合(検索する必要がある場合)、それ以外の場合はストアドプロシージャを使用します。

4
bob