基于Oracle的SQL优化--学习(十五)
复杂视图合并
复杂视图合并(ComplexViewMerging)是指针对那些所带视图的视图定义SQL语句中含有groupby或distinct的目标SQL的视图合并。
和简单视图合并、外连接视图合并一样,对这种视图定义SQL语句中含有groupby或distinct的复杂视图做视图合并也同样意味着要把其定义SQL语句拆开,并把其中的基表拿出来和外部査询中的表合并。这通常意味着上述视图定义SQL语句中的groupby或distinct操作会被推迟执行,也就是说,这种情况下通常会先做表连接,再做groupby或distinct操作,而不是像未做复杂视图合并时那样先在视图内部做完groupby或distinct操作,然后才和外部查询中的表做表连接。
复杂视图合并所对应的这种groupby或distinct操作的延迟,并不一定总是能带来执行效率以及性能上的提升。例如,如果groupby或distinct操作能过滤掉绝大部分的数据且表连接并不能有效过滤数据的话,那么先在视图内部做groupby或distinct操作,然后才和外部查询中的表做表连接的执行效率就会更高一些;但如果表连接能过滤掉绝大部分的数据而groupby或distinct操作并不能有效过滤数据的话,那么先做表连接,再做groupby或distinct操作的执行效率显然会更好一些。
正是因为复杂视图合并并不一定总是能带来目标SQL的执行效率及性能上的提升,所以在Oracle10g及其以后的版本中,对于复杂视图合并,只有当经过复杂视图合并后的等价改写SQL的成本值小于原SQL的成0本值时,Oracle才会对目标SQL执行复杂视图合并。
星型转换
星型转换(StarTransformation)是优化器处理表连接方法为星型连接的目标SQL时的一种优化手段,它的核心是将原星型连接中针对各个维度表(DimensionTable)的限制条件,通过等价改写的方式以额外的子査询施加到事实表(FactTable)上,然后再通过对事实表上各连接列上已存在的位图索引间的位图操作(如按位与、按位或等),来达到有效减少事实表上待访问的数据量,避免对事实表做全表扫描的目的,这就可以有效缩短原目标SQL的执行时间,提高其执行效率。
星型转化的核心是将原星型连接中针对各个维度表的限制条件通过等价改写的方式以额外的子查询施加到事实表上,然后再通过对事实表上各个连接列上已存在的位图索引间的位图操作来达到有效减少事实表上带访问的互数据量,避免对事实表做全表扫描。