【发布时间】:2021-06-05 02:15:49
【问题描述】:
我正在尝试从远程表中获取数据。使用递归 CTE 从本地表中的种子数据集扩展数据。查询非常慢(300 行种子到 800 最终行需要 7 分钟)。
对于其他没有递归查询的"tiny local, huge remote"-case,DRIVING_SITE 提示效果很好。我还尝试将种子集从本地表导出到具有相同结构的remotedb 上的辅助表中 - 登录remotedb - 作为纯本地查询运行查询(my_table 作为p,my_table_seed_copy 作为@987654328 @)。花了 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 分钟后返回数据)。
【问题讨论】:
-
在您发布的查询中,
p不在提示范围内。如果你把这个提示放在CTE 里面 - 可能在两个分支中会有什么不同吗?或者,也许,再加上实现 CTE 的提示? (只是推测......没有真正的洞察力,也无法测试。) -
@AlexPoole 谢谢,你的建议很有趣,我没有想到。不幸的是,两者都不起作用。我将通过这些尝试更新问题。
-
尝试使用 cte 在远程数据库创建视图,
-
@gsalem 谢谢,目前我不清楚如何将种子集合并到视图中。 CTE 的锚点部分应该以某种方式反映种子集,否则整个表将成为种子集。参数化视图在这种情况下会有所帮助,但 Oracle 不支持它。我目前正在尝试实现远程流水线功能。
-
您的远程表是否很大,而您在递归中消耗的很少?也许最好将数据拉到本地并进行递归?
标签: sql oracle oracle11g recursive-query database-link