Oracle
i 實體化視圖 執行概要 今天的數據庫
無論是數據倉庫
數據中心還是OLTP 系統
都包含大量的信息等待人們去發現和理解
然而
如何以一種及時的方式查找和表示這些信息是一個重大的問題
尤其是當需要搜索龐大數量信息的時候
實體化視圖能夠幫助解決這個問題
因為它提供了一種快速訪問和報告數據的方法
簡介 實體化視圖首先在Oracle
i 中引入
是稱為
概要管理
的組件的一部分
可能您的公司已經在使用實體化視圖
但只知道它的其他名字
例如概要或聚合表
在這裡我們討論如何創建和管理實體化視圖
還討論查詢重寫功能如何透明地重寫SQL 查詢
從而使用實體化視圖來縮短查詢響應時間
這將使數據庫用戶完全無需知道存在哪些實體化視圖
實體化視圖應看作是一種特殊的視圖
它物理上存在於數據庫內部
可以包括聯接和/或聚合
它能夠在執行之前預先計算開銷大的聯接和聚合操作
因此它的存在縮短了查詢執行時間
今天
使用自身概要的公司花費了大量的時間用於手工創建概要
識別將創建哪些概要
對概要進行索引和更新
以及建議用戶使用哪些概要
現在DBA 將僅須在開始時創建實體化視圖
而無論數據源何時發生變化
它都將被自動更新
此外還有一個概要顧問組件
它向DBA 推薦創建
刪除和保留哪些實體化視圖
數據倉庫或數據庫用戶將可以體會到使用實體化視圖的最大好處之一
DBA 無須再告訴他們存在哪些實體化視圖
他們可以對數據庫中的表或視圖編寫自己的查詢
然後Oracle 服務器的查詢重寫機制將自動重寫SQL 查詢以使用實體化視圖
這樣就大大縮短了查詢響應時間
終端用戶無須
了解概要
為何使用概要管理 當向數據倉庫終端用戶問起他們希望從中獲得什麼
大部分人都會回答
快速准確的信息
但是這也給數據倉庫設計者出了個大難題
為了回答
在y 地點我們賣出多少件x 產品
同時希望避免讀取表中的每一行
必須建立一條到數據的快速路由
解決此問題最常見的辦法之一就是創建概要表
Oracle 將其稱為實體化視圖
這一工作包括首先要理解典型負荷
然後創建規模非常小的實體化視圖
實體化視圖中可以包含所需信息的聯接和/或聚合
例如
為了回答前面的問題
實體化視圖中每種產品對應於一行
指明每個區域的銷售量
因此如果一家公司在
個地點銷售
件產品
則將要讀取的最大行數始終為
而無論已經售出多少商品
很明顯
實體化視圖必須保證精確
但該技術意味著終端用戶現在需要讀取的行數很少
因此可以始終快速地接收結果
數據庫容量已經增長到兆兆字節
因此使用這樣的方法來縮短查詢響應時間就顯得越來越重要
今天許多站點都創建了自己的概要表
因此使用Oracle
概要管理所帶來的額外好處是
Oracle 中的查詢重寫機制是透明的並采用實體化視圖(即使它僅能部分滿足查詢的需要)
具有高級的查詢重寫
可以使用實體化視圖對不同聚合級別(例如按照星期
月和年)進行報告
自動化機制刷新實體化視圖
單個請求刷新所有實體化視圖
DBA 不再需要花時間查找應創建哪些實體化視圖
系統將基於過去對數據庫或數據倉庫的查詢
向DBA 提供有關需要哪些概要的信息
概要管理組件 組成概要管理的有五個組件
維度
實體化視圖
刷新
查詢重寫
概要顧問 並不需要使用所有組件
但所選用的組件越多
獲得的優勢就越多
現在我們將詳細探討這些組件
模式需求 用於實體化視圖的模式類型或設計沒有什麼限制
因此在數據倉庫環境中
模式可以是雪花式的設計
但這並不是必須的
對於熟悉產品系統中數據庫設計技術的設計者來說
在一個數據倉庫中必須使用不同的規則和技術
例如
產品數據庫通常是規范化的
因此在這種情況下
時間維的表示方法最好是采用三個表
日
月
年
聯接條件應該滿足
將每個日期行連接到一個(僅一個)月份行
每個月份行連接到一個(僅一個)年份行
數據倉庫實現通常將導致一個完全非規范化的的時間維表
其中日期
月份
年份欄都處於同一個表中
不過
無論設計使用的是規范化還是非規范化表
都可以使用實體化視圖
維度 在創建一個實體化視圖之前
第一步應該是回顧模式
指明維度
維度定義了列之間的層次化(父級/子級)關系
所有的列無須來自同一個表
我們強烈推薦定義數據的維度
因為這將有助於查詢重寫和概要顧問做出更佳決策
數據庫設計者所面臨的另一個問題是
頻繁查詢將不會直接涉及所有的維度列
而僅參考與維度相關的那一列
例如查詢僅參考星期二而不是具體日期
因此當定義了維度之後
還必須描述維度列和表中其它列之間的關系
圖
顯示了包含兩個層次的時間維
從一個指定日期開始
有一個層次告訴我們該日期涉及哪些財政周
月或年
而另一個層次定義了日
月
季度和年之間的關系
當定義了一個層次之後
可以指定多個列來描述該層次
例如
如果City 在每個State 之內是唯一的
但是在States 之間不唯一
那麼就需要指定一個地理層次
其形式如(Country State
按照圖1 畫出維度,可以幫助DBA 完成定義過程。每個圓圈代表維度中的一個級別過LEVEL 子句來聲明。維層次通過HERARCHY 子句來聲明。概要管理也同樣依賴於DBA 定義約束條件,保證層次級別中每一級別的列非空。 在圖2 中,我們可以看到創建該維度的SQL 語句。級別名稱對應於維表中的列。然後使用這些級別名稱來描述每一層次。最後,使用ATTRIBUTE 子句來定義具有直接關系的項目。因此屬性calendar_month_name 與級別month 有關系。 使用JOIN KEY 子句來聲明維度中的1:n 聯接關系。在事實表和維表之間,使用事實表中的FOREIGN KEY 和NOT NULL 約束條件來表示這種聯接關系。 定義維度的相關提示 為幫助創建維度,請按照下面的簡單步驟: 1. 指明模式中的所有維度和維表。如果維度是規范化的,即它存儲在多個表中,那麼請檢查維表之間的聯接,確保每個子級行聯接到一個(僅一個)父級行。對於非規范化維度,請檢查子級列是否唯一確定父級(或屬性)列。如果不遵守這些規則,可能會在查詢時得到錯誤的結果。 2. 指明每一維度中的層次。例如,day 是month 的子級(我們可以將day 級別聚合到month),quarter 是year 的子級。 3. 指明層次中每一級別的屬性依賴關系。例如,指明calendar_month_name 是month 的屬性。 4. 指明數據倉庫中每個事實表到維度之間的聯接,檢查每個聯接,確保每個事實行聯接到一個(僅一個)維度行。必須聲明該條件,而且還可以選擇是否強制執行該條件,其方法是向事實關鍵列添加FOREIGN KEY 和NOT NULL 約束條件,向父級聯接鍵添加PRIMARY KEY 約束條件。可以通過NOVALIDATE 選項來啟用這些約束條件,從而無須花費時間來驗證表中的每一行是否滿足這些約束條件。對於所有未得到驗證的約束條件,還需要新的RELY 子句來使其能夠用於查詢重寫中。 圖2 創建時間維的SQL 語句 CREATE DIMENSION times_dim LEVEL day IS TIMES.TIME_ID LEVEL month IS TIMES.CALENDAR_MONTH_DESC LEVEL quarter IS TIMES.CALENDAR_QUARTER_DESC LEVEL year IS TIMES.CALENDAR_YEAR LEVEL fis_week IS TIMES.WEEK_ENDING_DAY LEVEL fis_month IS TIMES.FISCAL_MONTH_DESC LEVEL fis_quarter IS TIMES.FISCAL_QUARTER_DESC LEVEL fis_year IS TIMES.FISCAL_YEAR HIERARCHY cal_rollup ( day CHILD OF month CHILD OF quarter CHILD OF year ) HIERARCHY fis_rollup ( day CHILD OF fis_week CHILD OF fis_month CHILD OF fis_quarter CHILD OF fis_year ) ATTRIBUTE day DETERMINES (day_number_in_week, day_name, day_number_in_month, calendar_week_number) ATTRIBUTE month DETERMINES (calendar_month_desc, calendar_month_number, calendar_month_name, days_in_cal_month, end_of_cal_month) ATTRIBUTE quarter DETERMINES (calendar_quarter_desc,calendar_quarter_number, days_in_cal_quarter, end_of_cal_quarter) ATTRIBUTE year DETERMINES (calendar_year, days_in_cal_year, end_of_cal_year) ATTRIBUTE fis_week DETERMINES (week_ending_day, fiscal_week_number) ; 實體化視圖 一旦定義了維度,就可以創建實體化視圖。現在我們將著重介紹什麼是實體化視圖,在後面我們將看到建議功能如何推薦創建哪些實體化視圖。 實體化視圖定義可包括聚合,例如SUM MIN、MAX、AVG、COUNT(*)、COUNT(x)、COUNT(DISTINCT)、VARIANCE 或STDDEV, 還可以包括一個或多個聯接到一起的表和一個GROUP BY。可以進行索引和分區,還可以應用基本的DLL 操作,例如CREATE、ALTER 和DROP。 由於實體化視圖是數據庫中的一個對象,因此在很多方面它更像一個索引,因為 實體化視圖的目的是提高查詢執行性能。 實體化視圖的存在對於SQL 應用程序是透明的,因
From:http://tw.wingwit.com/Article/program/Oracle/201311/17937.html