Oracle優化器:星型轉換(Star Query Transformation )
Star query是一個事實表(fact table)和一些維度表(dimension)的join。每個維度表都跟事實表通過主外來鍵join,且每個維度表之間不join。
星型模式設計的好處:
1)提供了直接、直觀的業務實體與終端使用者schema設計的對映。 2)對典型的star query提供了高效能的優化。 3)通過大量的商業智慧工具的廣泛支援,可能會期望甚至要求資料倉庫架構包含維度表。 |
星型模式是用於簡單的資料集市和大型資料倉庫。 |
|
雪花狀模式(snowflake schema):
Snowflake schema是star schema的一種,但更復雜。它的維度資料被分到多個表而不是一個大表。更多的維度表,更多的外來鍵 |
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 |
星型查詢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 CREATEINDEX sales_c_state_bjix ON sales(customers.cust_state_province) FROM sales, customers WHERE sales.cust_id = customers.cust_id LOCALCOMPUTE<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是序列事務的一部分 |