Oracle 视图加入 table 非常奇怪的缓慢问题

Oracle view join to table very weird slow issue

我有一个tableorder,很简单,就是存储order个数据

我有一个view,它存储货币对和货币汇率。视图创建如下:

create or replace view view_currency_rate as (

  select c.* from currency_rate c, (

  select curr_from, curr_to, max(rate_date) max_rate_date from currency_rate
  where system_rate > 0
  group by curr_from, curr_to) r

  where c.curr_from = r.curr_from 
  and c.curr_to = r.curr_to
  and c.rate_date = r.max_rate_date
  and c.system_rate > 0

);

没什么特别的,这 view 填充来自 currency_rate table.[=22 的最新货币汇率 (curr_from -> curr_to) =]

当我执行以下操作时,它会填充 80k 行(所有数据),因为我有大量记录 table。而且用时不到5秒

第一次查询:

select * from 
 VIEW_CURRENCY_RATE c, order a
where 
 c.curr_from = A.CURRENCY;

我想添加更多的过滤器,所以我认为它可以更快,所以我添加了这个:

第二次查询:

select * from 
 VIEW_CURRENCY_RATE c, order a
where 
 a.id = 'xxxx'
 and c.curr_from = A.CURRENCY;

现在 运行 超过 1 分钟!我完全不知道这会发生什么。我以为是 oracle 优化器出了问题,所以我尝试找到另一种方法,想到仅 80K 数据就可以很快填充,所以我尝试从中获取数据,所以我嵌套了 SQL如下:

select * from (
 select * from 
 VIEW_CURRENCY_RATE c, order a
 where 
 c.curr_from = A.CURRENCY
)
where id = 'xxxx';

它运行 太慢了!我 运行 不知道,谁能解释一下我的脚本发生了什么?


2016 年 9 月 6 日更新
在我知道如何 'explain plan' 后,我捕获屏幕:

第一次查询(80K数据快):

第二个查询(慢一个):


慢的完全打破视野,形成新的SQL!这太奇怪了,Oracle 怎么能这样优化它?

看来问题与第二次查询的计划有关。因为它使用嵌套循环代替散列连接。 首先检查 _hash_join_enable 是否为真,如果不是,则将其更改为真。如果是真的,则 oracle 优化器存在一些问题。为了测试它,使用 USE_HASH(tab2 tab1) 提示。

问候 莫森

我正在使用 Mike 解决方案,我重新编写了脚本,现在速度 运行 很快,尽管根本原因尚未确定,可能是由于 oracle 优化器算法的工作方式与我不同期待。