web-dev-qa-db-ja.com

データベースビューのパフォーマンス-良い方法?

多くの場合、コードでモンスタークエリを作成する代わりに、データベースにビューを作成して、操作するデータを公開することを選択します。このフィールドに少し慣れていないので、ビューは、実行時に渡すクエリに追加される単なる別のクエリであると想定しています。

時には数十万の結果を返したり、時には数百万の結果を返したりするため、時間がかかる場合があります。だから、私の質問は、ビューがクエリの時間やクエリのパフォーマンスに影響するのですか?

2
DylanStout

Oracleフォーラムの2007年の このディスカッション によると、その時点ではビューはキャッシュされていませんでした。 この説明 から、Oracleがクエリ結果のキャッシュを提供していることは明らかですが、これはビューを介したクエリとは独立して機能するか、ビューなしで選択します。異なるクエリで同じビューを使用する場合、あるクエリのキャッシュ結果が同じビューに基づく別のクエリで再利用される可能性があるため、結果のキャッシュが少し役立つと思いますが、これはおそらくクエリとOracleバージョン。

ただし、Oracleはクエリを高速化できるマテリアライズドビューの概念をサポートしており、これらの種類のビューに基づくクエリもサポートしています。したがって、正しい答えは次のとおりです。

  • oracleのバージョン、データベース構成、特定のクエリによって異なります。

あなたができる最善のことは、実際にあなたの特定の状況のた​​めにそれを測定することです。

1
Doc Brown

一般に、ビューのパフォーマンスは、定義するクエリのパフォーマンスと同じです。通常、ビューが他のデータセットと結合されている場合、クエリプランナーはビューの境界を越えてすべてのトリックを実行できます。

最もよく使用するステートメントに対してEXPLAIN PLANを実行し、ボトルネックとなる可能性があるものを確認することをお勧めします。

コストのかかる処理を実行するビューを作成することができます materialized 計算された値が保存され、自動更新されます。これは、基になるテーブルがビューが照会されるほど頻繁に変更されない場合に意味があります。

1
9000

概念レベルでは、はい、ビューは単なる保存されたクエリであり、オプティマイザーは、コードに追加した追加の結合や述語と組み合わせて、最適なクエリプランを作成します。理論的には、ビューの使用は、コード内で「モンスタークエリ」を何度も複製することと同じです。また、DBAチームがクエリのパフォーマンスを向上させるために何かできる可能性がある限り、それをビューに含めると、すべてのクエリのパフォーマンスを透過的に向上させることが容易になる場合があります。

さて、雑草に取り掛かると、オプティマイザが別のクエリプランを選択するため、ビューを使用すると、モンスタークエリを複製する場合と比較して、一部のクエリのパフォーマンスが向上し、他のクエリのパフォーマンスが低下する可能性があります。 。オプティマイザは何万ものクエリプランを検討しており、どのブランチをたどり、どのブランチを放棄するかについて多くの決定を下しているため、ビューからどのクエリにメリットがあり、どのクエリが影響を受けるかを事前に知ることは困難です。 10053トレースファイルを深く調べない限り、ビューにロジックを配置することによって特定のクエリが改善または損なわれた理由を理解するのは難しいことがよくあります。ほとんどのクエリを作成するほとんどの開発者にとって、ビューの存在がパフォーマンスに意味のある影響を与えることはないと想定することは、かなり安全です。

1
Justin Cave