1.什么是星型转换
星型转换是优化器处理表连接方法为星型连接的目标SQL时的一种优化手段,
它的核心是将原星型连接中针对各个维度表的限制条件,通过等价改写的方式
以额外的子查询施加到事实表上,然后再通过对事实表各连接列上已存在的位图
索引间的位图操作(如按位与,按位或),来达到有效减少事实表上待访问的数据
量,避免对事实表全表扫描的目的,这就可以有效缩短原目标SQL的执行时间,
提高其执行效率。
中间是事实表,其他外连接的都是维度表。且维度表的连接列上有索引。
在星型连接中,事实表和维度表基于事实表的外键列和对应维度表的主键列连接,
并且通常在事实表的外键列上存在对应的位图索引。
select t2.cust_city,sum(t1.amount_sold) amount_sold_total
from sales t1,customers t2,products t3,channels t4
where t1.cust_id=t2.cust_id
and t1.prod_id=t3.prod_id
and t1.channel_id=t4.channel_id
and t2.country_id=52771
and t3.prod_name='Mouse Pad'
and t2.channel_desc='Internet'
group by t2.cust_city;
select dbms_metadata.get_ddl('TABLE','SALES','SH') from dual;
select dbms_metadata.get_ddl('INDEX','SALES_CUST_BIX','SH') from dual;
select dbms_metadata.get_ddl('INDEX','SALES_PROD_BIX','SH') from dual;
select dbms_metadata.get_ddl('INDEX','SALES_CHANNEL_BIX','SH') from dual;
select dbms_metadata.get_ddl('INDEX','SALES_CUST_BIX','SH') from dual;
星型转换的核心将原星型连接中对各个维度表的限制条件通过等价改写的方式以额外
的子查询施加到事实表上,然后再通过对事实表上各个连接列上已存在的位图索引
间的位图操作(如按位与,按位或等),来达到有效减少事实表上待访问的数据量,
避免对事实表做全表扫描的目的。
2.星型转换的SQL样例
星型转换等价改写范例如下;
select t2.cust_city,sum(amount_sold) amount_sold_total
from sales t1,customers t2
where t1.cust_id=t2.cust_id
and t1.cust_id in(select cust_id from customers where country_id=52771)
and t1.prod_id in(select prod_id from products where prod_name='Mouse Pad')
and t1.channel_id in (select channel_id from channels where channel_desc='Internet')
group by t2.cust_city;
3.开启星型转换。
true:开启星型转换,优化器会根据情况决定是否使用星型转换,如果使用星型转换会创建临时表。
flase:关闭星型转换
temp_disable:开启星型转换,但是在星型转换中禁止使用临时表来缓存维度表的过滤结果。
禁止在星型转换中创建临时表。
--开启星型转换,禁止给维度表的结果创建临时表。
alter session set star_transformation_enabled=temp_disable;
执行计划的 NOTE 部分有关键字:start transformation used for this statement,
表示SQL使用了星型转换。
star_transformation_enabled=true,执行计划中会看到临时表。
star_transformation_enabled=temp_disable,执行计划中不会看到临时表。
4.总结
开启星型转换,能够先计算维度表的数据,得到较小的结果集,然后再和事实表
做通过主键访问,避免全表扫描事实表。