データベースリンクを使用すると、Oracle Cacheはクエリを行います
-
16-10-2019 - |
質問
一部のベンダーは、データベースリンクを介して実行されたクエリがキャッシュされたり最適化されたりしないため、データベースとそれらの間のデータベースリンクを使用すべきではないと言っていました。
これを確認/侵害する情報は見つかりません。
素朴に、DBリンクを使用するときにOracleがキャッシュをクエリすることができない理由はわかりません。
解決
幾つかある 制限 データベースリンク付き。たとえば、DDLをリモートで実行することはできません。
リモートテーブルに対して実行されるクエリは次のとおりです まったく同じ方法で処理されていません 通常のテーブルとして:
ローカルOracleデータベースサーバーは、分散クエリを対応する数のリモートクエリに分割し、実行のためにリモートノードに送信します。リモートノードはクエリを実行し、結果をローカルノードに送り返します。次に、ローカルノードは必要な後処理を実行し、結果をユーザーまたはアプリケーションに返します。
ほとんどの場合、破損プロセスは適切であり、データベースリンクの予想されるオーバーヘッド(データベース間のネットワーク遅延、1つではなく2つのクエリ分析/処理など)を取得します。リモートサブ征服は、リモートデータベースによって通常のクエリとして扱われ、データは通常のクエリと同様にリモートキャッシュに入ります。
データを単一のデータベースに伝達して結合を実行する必要があるため、ローカルテーブルをリモートテーブル(または2つの異なるDBリンクからテーブル)に結合しようとすると、パフォーマンスの問題に巻き込まれる場合があります。その場合、分割プロセスを変更することをお勧めします(たとえば、ローカルデータベースの代わりにリモートデータベースで複雑な結合を実行します)。
ドキュメンテーション 分散クエリを調整できるいくつかの方法を詳しく説明してください。
他のヒント
分散クエリは、ローカルテーブルができるのと同じ方法で最適化することはできませんが、分散クエリが最適化されており、キャッシュはキャッシュです。 ベンダーは間違っています.
次のようなものを実行することでこれを見ることができます。実行ごとに実行数が上昇するのがわかります。
SELECT /* 23409268-09389 */ * FROM schema_name.table_name@db_link WHERE rownum<=1;
SELECT Executions, sql_text FROM v$sql WHERE sql_text LIKE 'select /* 23409268-09389%';
私の推測では、ベンダーは、Webサービスを介してデータにアクセスし、自分のデータベースからのデータと結合してアプリケーションレイヤーで実行することを望んでいると思います。このような構成のパフォーマンスは、たとえキャッシュされていなくても、データベースリンク上の結合よりもはるかに劣っている可能性があります。