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

来源:互联网 发布:央视网络电视台直播 编辑:程序博客网 时间:2024/05/21 14:49

问题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 0
原创粉丝点击