5

リモートテーブルからデータをフェッチしようとしています。データは、再帰 CTE を使用して、ローカル テーブル内のデータのシード セットから展開されます。クエリは非常に低速です (300 シード行から 800 最終行までに 7 分かかります)。

再帰クエリのない他の「小さなローカル、巨大なリモート」DRIVING_SITEの場合、ヒントはうまく機能します。また、シード セットをローカル テーブルから補助テーブルにremotedb同じ構造でエクスポートしようとしましたが、ログインしているときにremotedbクエリを純粋なローカル クエリ ( my_tableas pmy_table_seed_copyas i) として実行しました。4 秒かかったので、リモート サイトへのクエリを強制するとクエリが高速になると思いました。

Oracle にリモート サイトで再帰クエリを強制的に実行させる正しい方法は何ですか?

with s (id, data) as (
  select p.id, p.data
  from my_table@remotedb p
  where p.id in (select i.id from my_table i)
  union all
  select p.id, p.data
  from s
  join my_table@remotedb p on ...
)
select /*+DRIVING_SITE(p)*/ s.*
from s;

上記のクエリで、私は試しました

  • select /*+DRIVING_SITE(p)*/ s.*メインセレクトで
  • select /*+DRIVING_SITE(s)*/ s.*メインセレクトで
  • DRIVING_SITEクエリ全体で省略
  • select /*+DRIVING_SITE(x)*/ s.* from s, dual@remotedb xメインセレクトとして
  • select /*+DRIVING_SITE(p)*/ p.id, p.data最初の内部選択で
  • select /*+DRIVING_SITE(p)*/ p.id, p.data両方の内部選択で
  • select /*+DRIVING_SITE(p) MATERIALIZE*/ p.id, p.data両方の内部選択で
  • (完全を期すために- への書き換えconnect byはこの場合には適用されません-実際にはクエリはより複雑で、 では表現できない構造を使用しますconnect by)

すべて成功しませんでした (つまり、7 分後にデータが返されました)。

4

1 に答える 1