Oracle9i實(shí)體化視圖
2024-08-29 13:41:25
供稿:網(wǎng)友
Oracle9i 實(shí)體化視圖 執(zhí)行概要 今天的數(shù)據(jù)庫,無論是數(shù)據(jù)倉庫、數(shù)據(jù)中心還是OLTP 系統(tǒng),都包含大量的信息等待人們?nèi)グl(fā)現(xiàn)和理解。然而,如何以一種及時的方式查找和表示這些信息是一個重大的問題,尤其是當(dāng)需要搜索龐大數(shù)量信息的時候。 實(shí)體化視圖能夠幫助解決這個問題,因?yàn)樗峁┝艘环N快速訪問和報(bào)告數(shù)據(jù)的方法。 簡介 實(shí)體化視圖首先在Oracle8i 中引入,是稱為“概要治理”的組件的一部分??赡苣墓疽呀?jīng)在使用實(shí)體化視圖,但只知道它的其他名字,例如概要或聚合表。在這里我們討論如何創(chuàng)建和治理實(shí)體化視圖,還討論查詢重寫功能如何透明地重寫SQL 查詢,從而使用實(shí)體化視圖來縮短查詢響應(yīng)時間。這將使數(shù)據(jù)庫用戶完全無需知道存在哪些實(shí)體化視圖。 實(shí)體化視圖應(yīng)看作是一種非凡的視圖,它物理上存在于數(shù)據(jù)庫內(nèi)部,可以包括聯(lián)接和/或聚合。它能夠在執(zhí)行之前預(yù)先計(jì)算開銷大的聯(lián)接和聚合操作,因此它的存在縮短了查詢執(zhí)行時間。 今天,使用自身概要的公司花費(fèi)了大量的時間用于手工創(chuàng)建概要、識別將創(chuàng)建哪些概要、對概要進(jìn)行索引和更新,以及建議用戶使用哪些概要。 現(xiàn)在DBA 將僅須在開始時創(chuàng)建實(shí)體化視圖,而無論數(shù)據(jù)源何時發(fā)生變化,它都將被自動更新。此外還有一個概要顧問組件,它向DBA 推薦創(chuàng)建、刪除和保留哪些實(shí)體化視圖。 數(shù)據(jù)倉庫或數(shù)據(jù)庫用戶將可以體會到使用實(shí)體化視圖的最大好處之一,DBA 無須再告訴他們存在哪些實(shí)體化視圖。他們可以對數(shù)據(jù)庫中的表或視圖編寫自己的查詢。然后Oracle 服務(wù)器的查詢重寫機(jī)制將自動重寫SQL 查詢以使用實(shí)體化視圖。這樣就大大縮短了查詢響應(yīng)時間,終端用戶無須“了解概要”。 為何使用概要治理 當(dāng)向數(shù)據(jù)倉庫終端用戶問起他們希望從中獲得什么,大部分人都會回答:快速準(zhǔn)確的信息。但是這也給數(shù)據(jù)倉庫設(shè)計(jì)者出了個大難題:為了回答“在y 地點(diǎn)我們賣出多少件x 產(chǎn)品”,同時希望避免讀取表中的每一行,必須建立一條到數(shù)據(jù)的快速路由。 解決此問題最常見的辦法之一就是創(chuàng)建概要表,Oracle 將其稱為實(shí)體化視圖。這一工作包括首先要理解典型負(fù)荷,然后創(chuàng)建規(guī)模非常小的實(shí)體化視圖,實(shí)體化視圖中可以包含所需信息的聯(lián)接和/或聚合。例如,為了回答前面的問題,實(shí)體化視圖中每種產(chǎn)品對應(yīng)于一行,指明每個區(qū)域的銷售量。因此假如一家公司在5 個地點(diǎn)銷售2000 件產(chǎn)品,則將要讀取的最大行數(shù)始終為10000,而無論已經(jīng)售出多少商品。 很明顯,實(shí)體化視圖必須保證精確,但該技術(shù)意味著終端用戶現(xiàn)在需要讀取的行數(shù)很少,因此可以始終快速地接收結(jié)果。數(shù)據(jù)庫容量已經(jīng)增長到兆兆字節(jié),因此使用這樣的方法來縮短查詢響應(yīng)時間就顯得越來越重要。今天許多站點(diǎn)都創(chuàng)建了自己的概要表,因此使用Oracle8 概要治理所帶來的額外好處是: 1、Oracle 中的查詢重寫機(jī)制是透明的并采用實(shí)體化視圖(即使它僅能部分滿足查詢的需要)。 2、具有高級的查詢重寫,可以使用實(shí)體化視圖對不同聚合級別(例如按照星期、月和年)進(jìn)行報(bào)告。 3、自動化機(jī)制刷新實(shí)體化視圖,單個請求刷新所有實(shí)體化視圖。 4、DBA 不再需要花時間查找應(yīng)創(chuàng)建哪些實(shí)體化視圖。系統(tǒng)將基于過去對數(shù)據(jù)庫或數(shù)據(jù)倉庫的查詢,向DBA 提供有關(guān)需要哪些概要的信息。 概要治理組件 組成概要治理的有五個組件: 1、維度 2、實(shí)體化視圖 3、刷新 4、查詢重寫 5、概要顧問 并不需要使用所有組件,但所選用的組件越多,獲得的優(yōu)勢就越多?,F(xiàn)在我們將具體探討這些組件。 模式需求 用于實(shí)體化視圖的模式類型或設(shè)計(jì)沒有什么限制。因此在數(shù)據(jù)倉庫環(huán)境中,模式可以是雪花式的設(shè)計(jì),但這并不是必須的。 對于熟悉產(chǎn)品系統(tǒng)中數(shù)據(jù)庫設(shè)計(jì)技術(shù)的設(shè)計(jì)者來說,在一個數(shù)據(jù)倉庫中必須使用不同的規(guī)則和技術(shù)。例如,產(chǎn)品數(shù)據(jù)庫通常是規(guī)范化的,因此在這種情況下,時間維的表示方法最好是采用三個表:日、月、年。聯(lián)接條件應(yīng)該滿足:將每個日期行連接到一個(僅一個)月份行,每個月份行連接到一個(僅一個)年份行。數(shù)據(jù)倉庫實(shí)現(xiàn)通常將導(dǎo)致一個完全非規(guī)范化的的時間維表,其中日期、月份、年份欄都處于同一個表中。不過,無論設(shè)計(jì)使用的是規(guī)范化還是非規(guī)范化表,都可以使用實(shí)體化視圖。 維度 在創(chuàng)建一個實(shí)體化視圖之前,第一步應(yīng)該是回顧模式,指明維度。維度定義了列之間的層次化(父級/子級)關(guān)系,所有的列無須來自同一個表。我們強(qiáng)烈推薦定義數(shù)據(jù)的維度,因?yàn)檫@將有助于查詢重寫和概要顧問做出更佳決策。 數(shù)據(jù)庫設(shè)計(jì)者所面臨的另一個問題是,頻繁查詢將不會直接涉及所有的維度列,而僅參考與維度相關(guān)的那一列,例如查詢僅參考星期二而不是具體日期。因此當(dāng)定義了維度之后,還必須描述維度列和表中其它列之間的關(guān)系。 圖1 顯示了包含兩個層次的時間維。從一個指定日期開始,有一個層次告訴我們該日期涉及哪些財(cái)政周、月或年,而另一個層次定義了日、月、季度和年之間的關(guān)系。 當(dāng)定義了一個層次之后,可以指定多個列來描述該層次,例如,假如City 在每個State 之內(nèi)是唯一的,但是在States 之間不唯一,那么就需要指定一個地理層次,其形式如(Country State,
按照圖1 畫出維度,可以幫助DBA 完成定義過程。每個圓圈代表維度中的一個級別過LEVEL 子句來聲明。維層次通過HERARCHY 子句來聲明。概要治理也同樣依靠于DBA 定義約束條件,保證層次級別中每一級別的列非空?! ?在圖2 中,我們可以看到創(chuàng)建該維度的SQL 語句。級別名稱對應(yīng)于維表中的列。然后使用這些級別名稱來描述每一層次。最后,使用ATTRIBUTE 子句來定義具有直接關(guān)系的項(xiàng)目。因此屬性calendar_month_name 與級別month 有關(guān)系。 使用JOIN KEY 子句來聲明維度中的1:n 聯(lián)接關(guān)系。在事實(shí)表和維表之間,使用事實(shí)表中的FOREIGN KEY 和NOT NULL 約束條件來表示這種聯(lián)接關(guān)系。 定義維度的相關(guān)提示 為幫助創(chuàng)建維度,請按照下面的簡單步驟: 1. 指明模式中的所有維度和維表。假如維度是規(guī)范化的,即它存儲在多個表中,那么請檢查維表之間的聯(lián)接,確保每個子級行聯(lián)接到一個(僅一個)父級行。對于非規(guī)范化維度,請檢查子級列是否唯一確定父級(或?qū)傩裕┝?。假如不遵守這些規(guī)則,可能會在查詢時得到錯誤的結(jié)果。 2. 指明每一維度中的層次。例如,day 是month 的子級(我們可以將day 級別聚合到month),quarter 是year 的子級。 3. 指明層次中每一級別的屬性依靠關(guān)系。例如,指明calendar_month_name 是month 的屬性。 4. 指明數(shù)據(jù)倉庫中每個事實(shí)表到維度之間的聯(lián)接,檢查每個聯(lián)接,確保每個事實(shí)行聯(lián)接到一個(僅一個)維度行。必須聲明該條件,而且還可以選擇是否強(qiáng)制執(zhí)行該條件,其方法是向事實(shí)要害列添加FOREIGN KEY 和NOT NULL 約束條件,向父級聯(lián)接鍵添加PRIMARY KEY 約束條件。可以通過NOVALIDATE 選項(xiàng)來啟用這些約束條件,從而無須花費(fèi)時間來驗(yàn)證表中的每一行是否滿足這些約束條件。對于所有未得到驗(yàn)證的約束條件,還需要新的RELY 子句來使其能夠用于查詢重寫中。 圖2 創(chuàng)建時間維的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) ; 實(shí)體化視圖 一旦定義了維度,就可以創(chuàng)建實(shí)體化視圖?,F(xiàn)在我們將著重介紹什么是實(shí)體化視圖,在后面我們將看到建議功能如何推薦創(chuàng)建哪些實(shí)體化視圖。 實(shí)體化視圖定義可包括聚合,例如SUM MIN、MAX、AVG、COUNT(*)、COUNT(x)、COUNT(DISTINCT)、VARIANCE 或STDDEV, 還可以包括一個或多個聯(lián)接到一起的表和一個GROUP BY。可以進(jìn)行索引和分區(qū),還可以應(yīng)用基本的DLL 操作,例如CREATE、ALTER 和DROP。 由于實(shí)體化視圖是數(shù)據(jù)庫中的一個對象,因此在很多方面它更像一個索引,因?yàn)? 實(shí)體化視圖的目的是提高查詢執(zhí)行性能。 實(shí)體化視圖的存在對于SQL 應(yīng)用程序是透明的,因