我正在尝试从远程表中获取数据。使用递归 CTE 从本地表中的种子数据集扩展数据。查询非常慢(从 300 个种子行到 800 个最终行需要 7 分钟)。
对于其他没有递归查询的“微小的本地,巨大的远程”DRIVING_SITE
情况,提示效果很好。我还尝试将种子集从本地表导出到remotedb
具有相同结构的辅助表中,并且 - 正在登录remotedb
- 将查询作为纯本地查询(my_table
as p
,my_table_seed_copy
as 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 分钟后返回数据)。