Oracle View(ビュー)のパフォーマンスを高速化する – Database Performance Analyzer (DPA)によるチューニング


Oracleビューとは何か?


Oracle ビューとは、Oracle Database のデータディクショナリに格納されている、有効で名前付の SQLクエリのことです。ビューは、必要なときに実行できる単なる保存されたクエリですが、データを保存するわけではありません。ビューを仮想的なテーブル、または1つ以上のテーブルからデータをマッピングするプロセスとして考えると便利です。

ビューは情報の隠蔽やセキュリティなど、いくつかの目的で有用ですが、あまりに深くネストされると問題になることがあります。ビューを使用する利点としては、SQL文の複雑さを軽減する、ベースとなるテーブルのNAMEとOWNERを隠す、特定のテーブル行のみを他のユーザーと共有する、などがあります。

ビューの詳細は、ALL_VIEWS、USER_VIEWS、DBA_VIEWSを使用して、データ辞書内から問い合わせることができます。Oracleビューは、複雑なものと単純なものに分類されます。

単純なビュー
単純なビューは、単一のベース・テーブルのみを含むことができます。データ操作言語(DML)操作は、単純なビューに対して直接実行することができます。DMLの変更は、ビューのベーステーブルに適用されます。単純なビューは、以下のようなものです。

CREATE VIEW emp_view AS

SELECT * FROM emp;

CREATE VIEW dept20

AS SELECT ename, sal*12 annual_salary

FROM emp

WHERE deptno=20;

複合なビュー
複雑なビューは、単純なビューとは異なり、複数の基本テーブルに対して構築することができます。複雑なビューは、group by句、order by句、およびjoin条件を含むことができます。複雑なビューに対しては、DML操作を直接実行することはできません。複雑なビューに対するDML操作を有効にしたい場合、INSTEAD OFトリガーをクエリに含める必要があります。これにより、Oracle に変更内容が基本テーブルとどのように関連しているかが通知されます。

複雑なビューは、以下のようなものです。

CREATE VIEW sample_complex_view AS

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname, dept.loc

FROM emp, dept;

CREATE VIEW sample_complex_view AS

SELECT emp.ename, emp.job, emp.deptno, dept.dname, dept.loc

FROM emp, dept

WHERE emp.deptno = dept.deptno;


ビューの潜在的な問題

スキームの大きなサブセットを表現するために複雑なビューを使用し、エンドユーザーや開発者がこれらのビューにアクセスできるようにすると、パフォーマンスが低下する可能性が高くなります。複雑なビューを使用する場合、やむを得ない場合を除き、避けるべき状況を以下に示します。

●複雑な WHERE 句の追加:複雑なWHERE句の追加: 複雑なWHERE句を持つビューに対してクエリを実行すると、ビュー内のチューニングヒントをオーバーライドする可能性があります。この結果、実行計画が最適でなくなります。
●サブセットのクエリ:開発者は、ビュー内のすべてのテーブルが結合されることを認識せずに、複雑なビューのサブセットをクエリすることがよくあります。
●ヒントとビュー:ビューは有限のテーブルではないので、ビュークエリにSQLヒントを追加すると、実行プランのパフォーマンスが低下することがよくあります。オプティマイザが「混乱」すると、フルテーブルスキャンを実行します。ヒントは特定のSQL最適化のために使用できますが、ビューでの使用は推奨されません。

Oracle のビューは複雑なクエリをカプセル化したものであり、その使用には最大限の注意が必要です。ビューは、SQL のパフォーマンスを向上させるための手段ではないことを忘れないでください。SQL をカプセル化する必要がある場合、ビューを使用するのではなく、ストアドプロシージャ内に配置することを検討する必要があります。ビューは、基本的なクエリの複雑さを隠蔽するために設計されています。これにより、経験の浅いプログラマやエンドユーザがクエリを作成するのが容易になります。

ヒントとビュー

ビューを使用してヒントを用いてクエリを調整する場合、ビューが適切なコンテキストで使用されていることを確認してください。ここでは、パフォーマンス上の問題を発生させずにヒントとビューを組み合わせる方法を2つ紹介します。

●呼び出したクエリにヒントを追加する:ビューでヒントを使用することの危険性の一つは、クエリのコンテキストを変更することです。この場合、ビューの定義にある既存のヒントは無視され、オプティマイザを混乱させる可能性があります。これは、不必要なフルテーブルスキャンを引き起こし、パフォーマンスに影響を与えることになります。
●ビュー定義にヒントを埋め込む:これは、WHERE句なしで呼び出されたビューの場合に特に有効です。しかし、この方法は複雑なWHERE句でビューを呼び出すことによって、ビューの結果セットが変更された場合、性能に悪影響を与える可能性があります。ビューが特定のWHERE句で呼び出された場合、ビューに埋め込まれたSQLヒントの機能とともに、ビューコンテキストが変更される可能性があります。

個別に使用する場合、マテリアライズドビュー、Oracle ビュー、および SQL クエリヒントは、Oracle のパフォーマンス・チューニングのための便利なツールです。しかし、ビューを実装する際には、ビューの使い方を誤らないよう、特に注意することが重要であり、その結果、パフォーマンスの問題が発生する可能性があります。

Oracle ビューのパフォーマンスチューニング


Oracle ビューのパフォーマンスを最適化したい場合、まず基礎となるクエリをチューニングすることから始める必要があります。これが完了したら、次のステップは、ビューを使用してクエリをチューニングすることです。

ビューは、Oracleオプティマイザによって2つの方法で処理されます。

1.最初は、ビューをクエリに完全に統合する方法です。この方法では、ビューが処理された後、残りのクエリ条件が適用され、最終的な結果セットが生成されます。これは、関係するテーブルのサイズに大きく依存し、性能上の問題を引き起こす可能性があります。
2. ビューを使用してクエリを調整する2つ目の方法は、ビューをクエリの残りの部分とは別に処理することです。この場合、クエリのすべての条件をビューに適用することができ、結果的に結果セットを小さくすることができます。

ビューに特定のセット操作が含まれている場合、そのビューをクエリに統合することはできません。これらのセット操作には、以下のようなものがあります。

・GROUP BY
・SUM
・COUNT
・DISTINCT
・MAX
・MIN

ビューが大きな結果セットを生成する場合、あるいは、クエリ内の追加条件によって結果セットをフィルタリングする必要がある場合、ビューをクエリの残りの部分と統合することが最良の方法と思われます。Oracleのオプティマイザは、可能であれば、この処理を自動的に行います。

ほとんどの場合、ビューはクエリの残りの部分と統合されることをユーザは望みます。この方法は、最高のパフォーマンスをもたらします。しかし、GROUP BY 句を含むクエリでは、テーブルが結合されるまでグループ化が行われない場合があります。これは、特定の状況下ではパフォーマンスに悪い影響を与える可能性があります。この問題を解決するには、GROUP BY句をビューに移動することで、ビューを最初に評価するように強制することができます。Oracle バージョン 7.2 以降、ユーザーは FROM 句でサブクエリを使用することにより、暗黙的なビューを作成することができます。

ビ ュ ーはア プ リ ケーシ ョ ン で有用かつ重要な役割を果た し 、 Oracle のパフ ォーマ ン ス を向上 さ せ る ために利用で き ます。クエリがビューを使用するかどうかにかかわらず、そのクエリはテストされ、慎重に検討される必要があります。テストと検証を行うことで、アプリケーションの本稼働時にパフォーマンスが大幅に低下しないようにすることができます。

現状の活動状況ビュー


Oracleには、現在のセッションや待ち時間を表示するためのシステムビューが用意されています。これらは、トラブルシューティング活動やパフォーマンスチューニングに役立つことがあります。

現在のセッション
パフォーマンスの問題が発生した場合、データベース上の現在のセッションを検索して調べる必要があります。Oracle には sp_who、sp_who2、sp_lock はありませんが、v$session ビューは存在します。このビューには、現在アクティブになっているセッションが表示されます。セッションで実行されているすべてのクエリを表示するには、このビューを別のビューと結合します。

アクティビティモニタ
オラクルは、Automatic Workload Repository(AWR)の一部として統計情報を収集し、データベースの健全性を分析し、パフォーマンス問題を検出するためのレポートを提供します。スナップショットは、履歴ビューに情報を提供するために取得され、保存されます。これらの活動領域を表示することで、どの領域で過負荷が発生しているか、または応答が遅いかを把握することができ、パフォーマンス問題のトラブルシューティングに役立てることができます。

このプロセスは、たとえば、物理I/Oが多すぎるインスタンスや、SQLステートメントのハードパースなどを特定するのに役立つ場合があります。インスタンスアクティビティ」セクションには、データベースが稼働して以来、または最後に利用可能なスナップショットまで遡って収集された値が表示されます。

待機時間
Oracleのパフォーマンスに関する問題が発生した場合、待ち時間を確認することを強くお勧めします。この情報には、OEMビューでアクセスできます。クライアントイベントからの SQL*Net メッセージとは、クライアントがデータベースサーバーにアクションを実行するように指示するための Oracle の待ち時間を指します。この例では、サーバーは単に指示を待っているだけなので、パフォーマンスの問題は発生しないはずです。ただし、アプリケーションによっては、セッションを開いてから、データベースサーバーからデータを取得する前に応答を待つ場合があります。

Database Performance Analyzer (DPA)によるOracleビューのパフォーマンスチューニング


Database Performance Analyzer (DPA) for Oracleは、Oracleのビューパフォーマンスとクエリパフォーマンスを最適化するために設計された、素晴らしい機能を提供します。このツールは非常に洗練されたユーザー・フレンドリーなものであり、サポート機能も充実しています。フォーラムによる熱心なユーザのコミュニティなど、充実したサポート機能を備えています。

DPAの最大の特長は、応答時間分析に重点を置いていることで、Oracleビューのパフォーマンスチューニングをより正確かつ効果的に行えるようになります。レスポンスタイム解析は、データベースパフォーマンスのチューニングと最適化に対する実用的なアプローチであり、ユーザーは問題をより容易に特定し、測定可能な結果を得ることができます。問題の根本原因の特定、ボトルネックの特定、およびパフォーマンスの低下がエンドユーザーに与える影響に応じたアクションの優先順位付けを支援することで、Oracleデータベースの最適化をサポートします。DPAは、SQLステートメントのデータを1秒ごとに照合し、どのSQLクエリに焦点を当てるべきかを簡単に特定できるように構築されています。

DPAは、データベースのチューニングを行うために設計された数多くの機能を備えており、重要な指標を深く理解することができます。このツールでは、データを直感的なグラフやチャートの形で表示することができます。これらのグラフは、パフォーマンスの低いSQLステートメント、アプリケーションの待ち時間、ボトルネックの原因となる特定の待ちタイプやイベントなどを表示します。グラフの各セクションをクリックすることで、トラブルシューティングのために特定の問題を掘り下げることができます。

DPAでは、Oracleビューのパフォーマンスチューニングを次のレベルに引き上げるために設計されたテーブルチューニング・アドバイザーにアクセスすることができます。テーブルチューニングアドバイザーは、履歴データを照合し、棒グラフの形で情報を表示するため、複雑なデータベースチューニング作業に容易に着手することができます。この機能は、明確で実用的なアドバイスを提供することで、早急な対応が必要な問題の特定を支援します。また、DPAのアラーム機能を活用することで、問題周辺のデータをリアルタイムに掘り下げることも可能です。

Oracleビューのパフォーマンスチューニングの最初のステップは、問題の根本原因を突き止めることです。DPAは機械学習によるデータベースの異常検知機能を備えており、時間の経過とともに学習し改善されます。異常検知により、インスタンスの待機動作プロファイルを分析し、修正が必要な箇所を迅速に特定することができます。また、SQLチューニングアドバイザーを活用して、既存のSQLステートメントを分析し、パフォーマンスを向上させるためのクエリの修正方法に関する推奨事項にアクセスすることができます。

DPAのさまざまな機能は、Oracleビューのパフォーマンスチューニングプロセスをガイドし、実用的なアドバイスと高度な分析機能をすべて1つのインターフェイスで提供します。

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください