接上篇 114-在oracle数据库表现不佳的SQL,在oceanbase上会怎么样,来看看测试结果-1
场景6: push_pred与row_number分析函数
select a.object_id,x.id,x.object_id,x.ownerfrom t1 aleft join(select b.*, row_number() over (partition by object_id order by id desc) as rnfrom t10m b)xon a.object_id=x.object_id and x.rn=1order by a.created descoffset 0 rows fetch first 20 rows only;
oracle的表现(18.83秒):
(如果要得到好的表现, 需要hint的配合, 这就是优化需要做的事情. )
OB的表现(0.04秒):

场景7: not in与union
select count(*) fromt1 awhere object_id not in(select object_id from t10munion allselect object_id from t5m);
Oracle的表现:
预计要跑个把小时, 只能看看执行计划了:

(如果要想表现正常, 需要改写, 这就是优化需要做的事情)
OB执行时间1秒多, 这个表现才是正常的:

场景8: 连接消除
select count(*)from t1 aleft join (select object_id,count(*) as cnt from t10m group by object_id)bon a.object_id=b.object_id;
oracle的表现, 未能识别连接消除(2.49秒):

OB识别了这是一个可以消除的left join(1毫秒) :

场景9: 带过滤条件的最大/最小值
select max(object_id) from t10m where owner='SYS';注: object_id字段上有索引;
oracle的表现(1.2秒):

ob的表现(7毫秒):

场景10: exists里面包含非等值关联条件
select count(*)FROM T10m aWHERE EXISTS(SELECT 1FROM t1 bWHERE b.object_name='TAB'AND a.object_id = b.object_idAND b.created>=a.created --------非等着关联条件);
oracle的表现(1.27秒):

OB的表现(0.062秒):

注:上面对比的执行时间不是很重要, 表越大,对比会更明显. 主要是看执行计划.
(未完待续)
文章转载自老虎刘谈oracle性能优化,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




