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 子句中使用内部查询触发时,它需要 2 个小时才能完成,因为它正在遍历 db 链接。但是,如果我用实际日期值替换内部查询,则需要 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 回答