0

基本的に、ビューの一部としてクエリの下にあるビューがあります。

SELECT site_id ch_site_id 
  FROM bfg_router_pi_details 
 WHERE last_modified_date > (SELECT MAX (last_time_stamp) 
                               FROM saa_bfg_feed_ctl)

このクエリでは、bfg_router_pi_details は別のデータベースのビューであり、saa_bfg_feed_ctl は、このクエリを起動した同じデータベースのテーブルです。

このクエリが上記のように where 句で内部クエリを使用して起動されると、db リンクを経由するため、完了するまでに 2 時間かかります。ただし、内部クエリを実際の日付値に置き換えると、2 分かかります。そのため、ビューで変数を定義し、最後のタイムスタンプ値をその変数に割り当ててから、クエリの where 句でその変数を置き換えて実行を高速化する方法があるかどうかを確認しようとしています。手元の問題を理解していただければ幸いです。

4

2 に答える 2

2

これはおそらく、Oracle がクエリの駆動サイトとしてリモート サイトを選択しているためです。このヒントを試して、ローカル サイトからクエリを実行するように指示してください。

SELECT /*+DRIVING_SITE(saa_bfg_feed_ctl) */
       site_id ch_site_id 
FROM bfg_router_pi_details 
WHERE last_modified_date > (SELECT MAX (last_time_stamp) 
                           FROM saa_bfg_feed_ctl)

頭の中でこれについて100%確信があるわけではありません-クエリの計画を投稿すると、さらに役立つ可能性があります.

于 2012-10-04T07:33:24.780 に答える
1

それを行う方法はたくさんありますが、確実にすべての方法で plsql プログラミングが必要です。最も簡単な方法は、ビューに対してクエリを実行する前に、MAX を使用した変数が割り当てられているパッケージを作成することです。ビューは次のようになります

begin
 SELECT MAX (last_time_stamp) 
 into your_package.your_variable
 FROM saa_bfg_feed_ctl
end;

no_data_foundが必要かもしれませんが、それは私のお茶ではありません

SELECT site_id ch_site_id 
  FROM bfg_router_pi_details 
 WHERE last_modified_date > your_package.your_variable

同じ方法でユーザー plsql コンテキストを使用できますので、元のドキュメントを検討してください - http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

于 2012-10-04T07:31:05.967 に答える