Oracle(二)- 笛卡尔积造成的问题(一)

问题sql:

select /*+rule */ a.unoin,a.name,b.product_id,c.partiname from pc_union_detail a,sp_product_all b,bf_dict c where a.union_id=b.union_id and c.dict_id  between :1 and :2;


现象:当 a ,b,c三个表的数据量较大时会造成数据库很慢

分析:

/*+rule */是选择 RBO 优化器进行查询,基于规则的优化器。他有一个特点就是在选择表的时候驱动表是从右往左。驱动表可以理解成要查询的第一个表。那么上面的语句先选择 b  c  两个表,而b c表没有关联,那么会使用交叉连接,产生笛卡尔积,如果A表1w数据,B C表10w数据的话,那么此时首先会产生一个10W*10W的结果集。虽然通过 c.dict_id  between :1 and :2过滤了C表,发现仍然C表的数据量较大,此时由于此原因会造成Oracl产生latch:cache buffer chain,影响性能。

定位问题的语句:

select sql_id,count(*) from v$session where event='latch:cache buffer chain' order by 2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值