Oracle Star Schema简析
星型转换是一个非常强大的优化技术,它是通过对原来的SQL语句的隐式的改写来实现的,它能够很大程度减少I/O. 终端用户并不需要知道有关星型转换的任何细节。
数据库优化器会在合适的时候进行星型转换。要获得星型转换的最大性能,需要遵循以下3个基本的条件: www.2cto.com
1,事实表上的维度列上要有外键
2,事实表的每个外键上都有BITMAP索引。
3,star_transformation_enabled=true。
系统默认是false. 它有三个取值:(TRUE, FALSE, TEMP_DISABLE).其中TEMP_DISABLE表示不允许用临时表来存放第一次扫描的结果集。
星型查询中,维度表会被扫描两次,如果维度表很大,性能会很差,所以需要一个临时表来存放第一次扫描的维度表集合。
如果能够满足这三个条件,则查询会使用star transformation,而这是提高基于事实表的查询效率的主要的技术。
www.2cto.com
数据库进行星型查询时,会使用两个基本的阶段:
第一个阶段从事实表(或者说结果集)里获取所有必要的记录行。由于这是通过bitmap索引来检索数据,因此比较高效。
第二个阶段将该结果集与维度表进行关联。这叫做semi-join(也就是exists和in写法)。
注意:只有oracle企业版才有bitmap索引。标准版不支持bitmap索引和星型转换。
下面的SQL语句执行计划可以很好的说明进行"星型查询"的条件:
SQL> show parameter star_transformation_enabled
NAME TYPE VALUE
------------------------------------ ----------- -------------
star_transformation_enabled string FALSE
SQL> conn sh/sh
Connected.
SQL>SELECT ch.channel_class, c.cust_city,
t.calendar_quarter_desc,
SUM(s.amount_sold) sales_amount
FROM sales s,times t,customers c,channels ch
WHERE s.time_id = t.time_id AND
s.cust_id = c.cust_id AND
s.channel_id = ch.channel_id AND
c.cust_state_province = 'CA' AND
ch.channel_desc IN ('Internet','Catalog') AND
t.calendar_quarter_desc IN ('1999-Q1','1999-Q2')
11 GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;
Execution Plan
----------------------------------------------------------
Plan hash value: 1612666291
----------------------------------------------------------
--------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
Time | Pstart| Pstop |
--------------------------------------------------------------------------------
--------------------------
| 0 | SELECT STATEMENT | | 572 | 48048 | 793 (8)|
00:00:10 | | |
| 1 | HASH GROUP BY | | 572 | 48048 | 793 (8)|
00:00:10 | | |
|* 2 | HASH JOIN | | 3116 | 255K| 791 (8)|
00:00:10 | | |
|* 3 | TABLE ACCESS FULL | CHANNELS | 2 | 42 | 3 (0)|
00:00:01 | | |
|* 4 | HASH JOIN | | 6231 | 383K| 788 (8)|
00:00:10 | | |
|* 5 | TABLE ACCESS FULL | TIMES | 183 | 2928 | 15 (0)|
00:00:01 | | |
|* 6 | HASH JOIN | | 49822 | 2286K| 771 (8)|
00:00:10 | | |
|* 7 | TABLE ACCESS FULL | CUSTOMERS | 383 | 9958 | 332 (2)|
00:00:04 | | |
| 8 | PARTITION RANGE SUBQUERY| | 918K| 18M| 426 (9)|
00:00:06 |KEY(SQ)|KEY(SQ)|
| 9 | TABLE ACCESS FULL | SALES | 918K| 18M| 426 (9)|
00:00:06 |KEY(SQ)|KEY(SQ)|
---------------------------------------------------------------
--------------------------
www.2cto.com
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("S"."CHANNEL_ID"="CH"."CHANNEL_ID")
3 - filter("CH"."CHANNEL_DESC"='Catalog' OR "CH"."CHANNEL_DESC"='Internet')
4 - access("S"."TIME_ID"="T"."TIME_ID")
5 - filter("T"."CALENDAR_QUARTER_DESC"='1999-Q1' OR "T"."CALENDAR_Q