SQL优化之视图合并

下面两个脚本的写法得到的结果是相同的。但是聚合的过程一个发生在外部一个发生在内部,执行过程是大不相同的,其运行的效率也自然不同。

脚本1:

select t1.meterial_id
    ,t2.play_cnt
    ,t2.play_device_cnt
from t_material as t1 
inner join (
    select track_id
        ,count(1) as play_cnt
        ,count(distinct device_id) as play_device_cnt
    from t_play_daily_log
)as t2 on t1.track_id=t2.track_id
where t1.meterial_id='M000236'

脚本2:

select t1.meterial_id
    ,count(1) as play_cnt
    ,count(distinct device_id) as play_device_cnt
from t_material as t1 
inner join (
    select track_id,device_id
    from t_play_daily_log
)as t2 on t1.track_id=t2.track_id
where t1.meterial_id='M000236'
group by t1.meterial_id 

为什么?

在Oracle数据库中,执行SQL任务之前,Oracle会提前自动评估如果改变查询的写法会不会提供更好的查询计划。在以上两个执行计划中,脚本1的写法会自动由内部的优化器转化成脚本2的写法来运行。这个优化过程就是视图合并。

视图合并是一种能将内嵌或者存储式视图展开为能够独立分析或者查询剩余部分合并成总体执行计划的独立查询块的转换。改写后的语句基本上不再包含视图。

在t_play_daily_log有track_id索引的情况下,在脚本1中t_play_daily_log表需要全表扫描然后执行聚合,而在脚本2中的t_play_daily_log中只需读取指定的记录然后聚合就可以了,孰优孰劣立见分晓。

那么问题来了,在Oracle中脚本1的写法会被以视图合并的方式自动优化成脚本2的写法。而在Hive的环境下它能够被自动优化吗?欢迎你来一起讨论。

你可能感兴趣的:(Oracle,SQL)