熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle9i實體化視圖

2013-11-13 16:10:30  來源: Oracle 

  Oraclei 實體化視圖    執行概要    今天的數據庫無論是數據倉庫數據中心還是OLTP 系統都包含大量的信息等待人們去發現和理解然而如何以一種及時的方式查找和表示這些信息是一個重大的問題尤其是當需要搜索龐大數量信息的時候    實體化視圖能夠幫助解決這個問題因為它提供了一種快速訪問和報告數據的方法    簡介    實體化視圖首先在Oraclei 中引入是稱為概要管理的組件的一部分可能您的公司已經在使用實體化視圖但只知道它的其他名字例如概要或聚合表在這裡我們討論如何創建和管理實體化視圖還討論查詢重寫功能如何透明地重寫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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.