小春网

 找回密码
 注册账号
查看: 1685|回复: 16
收起左侧

[IT 交流] 也问个oracle问题

[复制链接]
发表于 2009-9-24 21:42:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

x
SELECT
       a.*
FROM
       tab_a a
WHERE
     NOT EXISTS (
          SELECT
                'X'
          FROM
               tab_b  b
          WHERE
               ....
     )
   AND  EXISTS (
          SELECT
              'X'
          FROM
                tab_c c
          WHERE  
               ....
   )
a和b为大表(1000万条数据)  c为小表(10万条数据)
oracle9i环境上执行
现在执行计划是
c和a join再和b join
原因是在cost模式下,oracle会自动把小表当基准表。

我想让a和b先结合再和c结合?
因为a和b先结合的结果只有10条以下的数据。中间表很小
而a和c先结合的话还是1000万以上条数据。中间表很大,所以很费时间。


请高手帮帮忙。
发表于 2009-9-24 23:20:50 | 显示全部楼层
a表和b表结合 括在括号里面强制优先级呢?  oracle有可能还是会优化sql文。。。估计得改session配置,我也是菜鸟,只会写些sql文。。
回复

使用道具 举报

发表于 2009-9-25 09:07:55 | 显示全部楼层
你去工作版

问一个叫rman的哥们

他要是不知道的话,这个论坛上面就没有人会了
回复

使用道具 举报

 楼主| 发表于 2009-9-25 09:54:38 | 显示全部楼层
谢谢两位仁兄的回复。
我一直想着用hint文来控制执行计划。就是不知道该用什么hint文。
郁闷啊!
回复

使用道具 举报

发表于 2009-9-25 11:07:05 | 显示全部楼层
还是建议不要用hint文,可以考虑把关联字段的index类型改称位图索引
另外,中间表小就不一定快
回复

使用道具 举报

发表于 2009-9-25 11:59:09 | 显示全部楼层
我觉得你应该以小表为驱动
因为exist的好处就是找到结果就返回
而且不作无味的scan
回复

使用道具 举报

 楼主| 发表于 2009-9-25 14:17:15 | 显示全部楼层
file:///C:/Documents
回复

使用道具 举报

 楼主| 发表于 2009-9-25 14:27:35 | 显示全部楼层
看下面这个执行计划
plan2.gif
其中orgmain.trade_org就是我所有的大表A
      organs.ans_trade为大表B
      orgmain.pk_accountattr_org为小表B

这个sql在执行table scan(表A)的时候只用了6分钟
但是hash join用了26分钟
回复

使用道具 举报

发表于 2009-9-25 17:01:17 | 显示全部楼层
你能不能 用日文 来 说一遍 你想 干什么吗?

如果 这个论坛上没人搞得定的话

去 日本的 网站 有很多高人会回答的
回复

使用道具 举报

发表于 2009-9-26 09:25:28 | 显示全部楼层
SELECT
       a.*
FROM
       tab_a a
WHERE
     NOT EXISTS (
          SELECT
                'X'
          FROM
               tab_b  b
          WHERE
               ....
     )
   AND  EXISTS (
          SELECT
              'X'
          FROM
                tab_c c
          WHERE  
               ....
   )


这个SQL里面 表a,b,c评级  所以 按照你说的 “原因是在cost模式下,oracle会自动把小表当基准表。
” 的话  就是c成为基准表了

如果 想先 a, b结合  再跟c结合  可以试一下下面的形式
select  c.f1, c.f2, d.f1 ...
from   c ,
        (select a.f1,a.f2,...
          from    a, b
          where  a.fn=b.fn      <- a,b表的结合条件
                      and ...           <- 其他条件
      ) d
where  c.f1 = d.f1
           and ...

这样 就可以做到  先让 a, b结合得到结果作为中间表(d), 然后将中间表d再跟c表结合
cost没有计算过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表