Star query是一个事实表(fact table)和一些维度表(dimension)的join。每个维度表都跟事实表通过主外键join,且每个维度表之间不join。
星型模式设计的好处:
1) 提供了直接、直观的业务实体与终端用户schema设计的映射。 2) 对典型的star query提供了高性能的优化。 3) 通过大量的商业智能工具的广泛支持,可能会期望甚至要求数据仓库架构包含维度表。 |
星型模式是用于简单的数据集市和大型数据仓库。 |
|
雪花状模式(snowflake schema):
Snowflake schema是star schema的一种,但更复杂。它的维度数据被分到多个表而不是一个大表。更多的维度表,更多的外键joins,使查询更复杂,查询性能下降。 |
Oracle建议使用star schema替代snowflake schema,除非你有别的原因。 |
|
优化Star Query:
1) 在fact table的每个外键列上建立bitmap index。 2) 初始化参数STAR_TRANSFORMATION_ENABLED 应被设为TRUE,默认false。 |
星型转换(Star transformation)能为star query提供高效的查询性能。 |
![]() |
合适的情况下,Oracle会自动选择star transformation技术,隐视重写star query SQL,提高star query效率。
|
星型查询2个基本步骤: 1) 从fact table中检索出必要的结果集。(bitmap index会提高效率) 2) 结果集与维度表joins。 |
星型转换(bitmap index)
通过bitmap AND操作将3个维度表bitmaps为一个单独的bitmap,然后与fact table通过bitmap indexes逻辑JOIN。 |
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' BY ch.channel_class, c.cust_city, t.calendar_quarter_desc; |
![]() |
星型转换(a Bitmap Join Index)
--建一个bitmap join index CREATE INDEX sales_c_state_bjix ON sales(customers.cust_state_province) FROM sales, customers WHERE sales.cust_id = customers.cust_id LOCAL COMPUTE<span color:navy;background:white;"="" style="word-wrap: break-word; font-size: 10pt;"> STATISTICS; |
即使用bitmap join index代替与表customer的bitmap join。 |
星型转换的限制
1、 下面的情况不支持星型转换 ? 查询中使用hint ? 查询包含绑定变量 ? Fact table上的bitmap indexes太少 ? 远程fact tables ? Anti-joined tables ? Fact table是一个unmerged view ? Fact table是一个partitioned view
2、 优化器不选择star transformation的情况 ? 表有一个好的单表访问路径 ? 表太小不值得转换
3、临时表在下面情况下不适用star transformation ? 数据库read-only模式 ? Star query是串行事务的一部分 |