Data Warehouse Guide文件筆記(四):dimension

asword發表於2009-02-09
作者: NinGoo(http://ningoo.itpub.net)
發表於: 2006.10.22 23:13
分類: DW&BI
出處: http://ningoo.itpub.net/post/2149/223164
---------------------------------------------------------------[@more@]

資料倉儲中由於資料量巨大,一些聚合計算等操作往往透過物化檢視預先計算儲存。但是,不可能對所有維度的所有可能的聚合操作都建立物化檢視,一則空間不允許,二則重新整理時間也不允許。那麼,在對某些聚合操作的sql進行查詢重寫時,就希望能利用已經存在的物化檢視,儘管他們的聚合操作條件不完全一致。而dimension定義的各個level之間的層次關係,對於一些上卷(rolling up)和下鑽(drilling down)操作的查詢重寫的判斷是相當重要的,而dimension中定義的attributes對於使用不同的列來做分組的查詢重寫起作用。

一個典型的dimension定義如下:
CREATE DIMENSION products_dim
LEVEL product IS (products.prod_id)
LEVEL subcategory IS (products.prod_subcategory)
LEVEL category IS (products.prod_category)
HIERARCHY prod_rollup (
product CHILD OF
subcategory CHILD OF
category
)
ATTRIBUTE product_info LEVEL product DETERMINES
(products.prod_name, products.prod_desc,
prod_weight_class, prod_unit_of_measure,
prod_pack_size, prod_status, prod_list_price, prod_min_price)
ATTRIBUTE subcategory DETERMINES
(prod_subcategory, prod_subcategory_desc)
ATTRIBUTE category DETERMINES
(prod_category, prod_category_desc);

dimension中三個重要的屬性:level,hierarchy,attribute。其中level定義了一個或一組列為一個整體,而hierarchy則定義了各個level之間的層次關係,父level和子level之間是一種1:N的關係,而且,在dimension中可以指定多個hierarchy層次關係。attribute則定義了level和其他列的一個1:1的關係,但這種1:1的關係不一定是可逆的,比如上面的列子,根據product_info,也就是prod_id,可以確定prod_name,但不一定要求prod_name就能確定prod_id。

而且,各個level之間的列不一定要來自同一個table,對於雪花模型,dimension table可能被規範化為許多的小表,則dimension中的level可能是來自不同表中的列。這是需要在dimension中指定join key來指出各個表之間的關聯列。例如:

CREATE DIMENSION customers_dim
LEVEL customer IS (customers.cust_id)
LEVEL city IS (customers.cust_city)
LEVEL state IS (customers.cust_state_province)
LEVEL country IS (countries.country_id)
LEVEL subregion IS (countries.country_subregion)
LEVEL region IS (countries.country_region)
HIERARCHY geog_rollup (
customer CHILD OF
city CHILD OF
state CHILD OF
country CHILD OF
subregion CHILD OF
region
JOIN KEY (customers.country_id) REFERENCES country);

如果不指定skip when null子句,每個level中都不允許出現null值。

透過dbms_dimension.describe_dimension可以檢視dimension的定義。
透過dbms_dimension.validate_dimension可以檢查dimension是否定義正確,在執行之前需要執行ultdim.sql建立一個dimension_exceptions表,如果定義有誤,則會在dimension_exceptions中查到相應的記錄。在9i裡,validate_dimension在dbms_olap包中。

關於dimension, AskTom上有個問題寫得比較詳盡,值得仔細研究,。

(需要引用, 請註明出處: http://ningoo.itpub.net)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-1017042/,如需轉載,請註明出處,否則將追究法律責任。

相關文章