Oracle優化器:星型轉換(Star Query Transformation )

Star query是一個事實表(fact table)和一些維度表(dimension)的join。每個維度表都跟事實表通過主外鍵join,且每個維度表之間不join


星型模式設計的好處:

1) 提供了直接、直觀的業務實體與終端用戶schema設計的映射。

2) 對典型的star query提供了高性能的優化。

3) 通過大量的商業智能工具的廣泛支持,可能會期望甚至要求數據倉庫架構包含維度表。

星型模式是用於簡單的數據集市和大型數據倉庫。

 


 

雪花狀模式(snowflake schema):

Snowflake schemastar 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代替與表customerbitmap 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是串行事務的一部分


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章