web-dev-qa-db-ja.com

データベースビューはクエリのパフォーマンスに影響しますか?

データベースビューは、データへのアクセスを簡素化する手段にすぎませんか、それとも、ビューの基になっているクエリを実行するだけでなく、ビューにアクセスするときにパフォーマンス上の利点がありますか?ビューは、保存されたビュークエリをビューデータの各クエリに追加することと機能的に同等であると思いますが、これは正しいですか、それとも他の詳細や最適化が行われていますか?

22

ビュー内で実行される特定のクエリとビュー外で実行される同じクエリは同等に実行されるはずですが、2つのビューを結合する必要がある場合、事態ははるかに複雑になります。不要なテーブルをクエリに取り込んだり、テーブルを冗長に取り込んだりする可能性があります。データベースのオプティマイザは、適切なクエリ実行プランを作成するのにさらに問題が発生する可能性があります。したがって、ビューは、よりきめ細かいセキュリティなどを可能にするという点では非常に優れている可能性がありますが、モジュール性には必ずしも適していません。

9
Craig Stuntz

これはRDBMSに依存しますが、通常は最適化が行われておらず、クエリを単純化するための便利な方法にすぎません。ただし、一部のデータベースシステムは「マテリアライズドビュー」を使用しますが、キャッシュメカニズムを使用します。

7

私は常にビューを読み取り専用のストアドプロシージャのように考えてきました。データベースにできるだけ多くの情報を事前に提供して、データベースが可能な限りプリコンパイルできるようにします。

ビューにインデックスを付けることもでき、実行しているクエリの種類に応じて、必要なデータの最適化されたビューにアクセスできます。

7
Robin Day

通常、ビューは、頻繁に必要な結果セットを定義するための一般的な省略形を作成する方法にすぎません。

ただし、欠点があります。ビューを使用したいときに、いつか必要になると思われるすべての列を追加したいという誘惑に駆られます。だからYAGNIは違反されています。列だけでなく、「万が一に備えて」追加の外部結合が追加されることもあります。したがって、インデックスをカバーすると、それ以上カバーできなくなる可能性があり、クエリプランが複雑になる(そして効率が低下する)可能性があります。

YAGNIはSQL設計の重要な概念です。

5
dkretz

私はこれが古いスレッドであることを知っています。議論は良いですが、もう一つ考えてみたいと思います。パフォーマンスは、データのプルに使用しているものによっても異なります。たとえば、Microsoft Accessのようなものをフロントエンドで使用している場合は、ビューを使用することで、複雑なクエリのパフォーマンスを確実に向上させることができます。これは、Accessが常にSQLサーバーからプルするわけではないためです。場合によっては、テーブル全体をプルして、そこからローカルで処理しようとします。ビューを使用する場合はそうではありません。

2
Michael

一般的に、ビューは、基になるテーブルに直接書き込まれたクエリと同等に実行する必要があります。

ただし、Edgeの場合がある可能性があり、コードをテストすることをお勧めします。最新のすべてのRDBMSシステムには、クエリプランを確認し、実行を監視できるツールがあります。あなたがあなたの指先で決定的なデータを持つことができるとき、それのために私の(または他の誰かの)言葉をとらないでください。

2
Michael Dorfman

はい、すべての最新のRDBMS(2005以降のMSSQLなど)では、ビューのクエリプランがキャッシュされ、クエリの計画のオーバーヘッドが排除され、インラインで実行される同じSQLよりもパフォーマンスが向上します。これ以前は(パラメーター化されたSQL /プリペアドステートメントにも適用されます)、人々はストアドプロシージャのパフォーマンスが優れていると正しく考えていました。

今日でも多くの人がこれに固執しており、現代のDBの神話となっています。 Views/PSがSPのキャッシュされたクエリプランニングを取得して以来、それらはほぼ均等になっています。

1
Codex