




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1/ 10數(shù)據(jù)庫設(shè)計規(guī)范化的五個要求通常情況下, 可以從兩個方面來判斷數(shù)據(jù)庫是否設(shè)計的比較規(guī)范。 一是看看是否擁有大 量的窄表, 二是寬表的數(shù)量是否足夠的少。 若符合這兩個條件, 則可以說明這個數(shù)據(jù)庫的規(guī) 范化水平還是比較高的。 當(dāng)然這是兩個泛泛而談的指標。 為了達到數(shù)據(jù)庫設(shè)計規(guī)范化的要求, 一般來說,需要符合以下五個要求。要求一:表中應(yīng)該避免可為空的列。雖然表中允許空列,但是,空字段是一種比較特殊的數(shù)據(jù)類型。數(shù)據(jù)庫在處理的時候, 需要進行特殊的處理。 如此的話, 就會增加數(shù)據(jù)庫處理記錄的復(fù)雜性。 當(dāng)表中有比較多的空 字段時,在同等條件下,數(shù)據(jù)庫處理的性能會降低許多。所以,雖然在數(shù)據(jù)庫表設(shè)計的
2、時候,允許表中具有空字段,但是,我們應(yīng)該盡量避免。 若確實需要的話,我們可以通過一些折中的方式, 來處理這些空字段, 讓其對數(shù)據(jù)庫性能的 影響降低到最少。一是通過設(shè)置默認值的形式, 來避免空字段的產(chǎn)生。 如在一個人事管理系統(tǒng)中, 有時候 身份證號碼字段可能允許為空。 因為不是每個人都可以記住自己的身份證號碼。 而在員工報 到的時候,可能身份證沒有帶在身邊。所以,身份證號碼字段往往不能及時提供。為此,身 份證號碼字段可以允許為空,以滿足這些特殊情況的需要。但是,在數(shù)據(jù)庫設(shè)計的時候,則 可以做一些處理。如當(dāng)用戶沒有輸入內(nèi)容的時候,則把這個字段的默認值設(shè)置為 0 或者為 N/A。以避免空字段的產(chǎn)生。
3、二是若一張表中,允許為空的列比較多, 接近表全部列數(shù)的三分之一。 而且, 這些列在 大部分情況下,都是可有可無的。 若數(shù)據(jù)庫管理員遇到這種情況, 筆者建議另外建立一張副 表,以保存這些列。 然后通過關(guān)鍵字把主表跟這張副表關(guān)聯(lián)起來。將數(shù)據(jù)存儲在兩個獨立的 表中使得主表的設(shè)計更為簡單,同時也能夠滿足存儲空值信息的需要。要求二:表不應(yīng)該有重復(fù)的值或者列。如現(xiàn)在有一個進銷存管理系統(tǒng),這個系統(tǒng)中有一張產(chǎn)品基本信息表中。這個產(chǎn)品開發(fā)有 時候可以是一個人完成, 而有時候又需要多個人合作才能夠完成。 所以, 在產(chǎn)品基本信息表 產(chǎn)品開發(fā)者這個字段中,有時候可能需要填入多個開發(fā)者的名字。如進銷存管理中, 還需要對
4、客戶的聯(lián)系人進行管理。 有時候, 企業(yè)可能只知道客戶一個 采購員的姓名。但是在必要的情況下,企業(yè)需要對客戶的采購代表、倉庫人員、財務(wù)人員共 同進行管理。因為在訂單上,可能需要填入采購代表的名字 ;可是在出貨單上,則需要填入 倉庫管理人員的名字等等。為了解決這個問題, 有多種實現(xiàn)方式。但是, 若設(shè)計不合理的話在,則會導(dǎo)致重復(fù)的值 或者列。如我們也可以這么設(shè)計,把客戶信息、聯(lián)系人都放入同一張表中。為了解決多個聯(lián)系人的問題,可以設(shè)置第一聯(lián)系人、第一聯(lián)系人電話、第二聯(lián)系人、第二聯(lián)系人電話等等。若還有第三聯(lián)系人、第四聯(lián)系人等等,則往往還需要加入更多的字段??墒沁@么設(shè)計的話, 會產(chǎn)生一系列的問題。 如客戶
5、的采購員流動性比較大, 在一年內(nèi)換 了六個采購員。此時, 在系統(tǒng)中該如何管理呢 ?難道就建立六個聯(lián)系人字段 ?這不但會導(dǎo)致空 字段的增加,還需要頻繁的更改數(shù)據(jù)庫表結(jié)構(gòu)。明顯,這么做是不合理的。也有人說,可以 直接修改采購員的名字呀??墒沁@么處理的話,會把原先采購訂單上采購員的名字也改變了。 因為采購單上客戶采購員信息在數(shù)據(jù)庫中存儲的不是采購員的名字, 而只是采購員對應(yīng)的一 個編號。 在編號不改而名字改變了的情況下, 采購訂單上顯示的就是更改后的名字。 這不利 于時候的追蹤。2/ 10所以, 在數(shù)據(jù)庫設(shè)計的時候要盡量避免這種重復(fù)的值或者列的產(chǎn)生。筆者建議, 若數(shù)據(jù)庫管理員遇到這種情況, 可以改變
6、一下策略。 如把客戶聯(lián)系人另外設(shè)置一張表。 然后通過客 戶 ID 把供應(yīng)商信息表跟客戶聯(lián)系人信息表連接起來。也就是說,盡量將重復(fù)的值放置到一 張獨立的表中進行管理。然后通過視圖或者其他手段把這些獨立的表聯(lián)系起來。要求三:表中記錄應(yīng)該有一個唯一的標識符。在數(shù)據(jù)庫表設(shè)計的時候,數(shù)據(jù)庫管理員應(yīng)該養(yǎng)成一個好習(xí)慣,用一個 ID 號來唯一的標 識行記錄,而不要通過名字、編號等字段來對紀錄進行區(qū)分。每個表都應(yīng)該有一個 ID 列, 任何兩個記錄都不可以共享同一個 ID值。另外,這個 ID 值最好有數(shù)據(jù)庫來進行自動管理, 而不要把這個任務(wù)給前臺應(yīng)用程序。否則的話,很容易產(chǎn)生ID 值不統(tǒng)一的情況。另外,在數(shù)據(jù)庫設(shè)
7、計的時候,最好還能夠加入行號。如在銷售訂單管理中,ID 號是用戶不能夠維護的。但是, 行號用戶就可以維護。如在銷售訂單的行中, 用戶可以通過調(diào)整行 號的大小來對訂單行進行排序。通常情況下, ID 列是以 1 為單位遞進的。但是,行號就要 以 10 為單位累進。如此,正常情況下,行號就以 10、 20、 30 依次擴展下去。若此時用戶 需要把行號為 30 的紀錄調(diào)到第一行顯示。 此時,用戶在不能夠更改 ID 列的情況下,可以更 改行號來實現(xiàn)。如可以把行號改為 1,在排序時就可以按行號來進行排序。如此的話,原來 行號為 30 的紀錄現(xiàn)在行號變?yōu)榱?1,就可以在第一行中顯示。這是在實際應(yīng)用程序設(shè)計中
8、 對 ID 列的一個有效補充。這個內(nèi)容在教科書上是沒有的。需要在實際應(yīng)用程序設(shè)計中,才 會掌握到這個技巧。要求四:數(shù)據(jù)庫對象要有統(tǒng)一的前綴名。一個比較復(fù)雜的應(yīng)用系統(tǒng),其對應(yīng)的數(shù)據(jù)庫表往往以千計。若讓數(shù)據(jù)庫管理員看到對象 名就了解這個數(shù)據(jù)庫對象所起的作用, 恐怕會比較困難。 而且在數(shù)據(jù)庫對象引用的時候, 數(shù) 據(jù)庫管理員也會為不能迅速找到所需要的數(shù)據(jù)庫對象而頭疼。為此,筆者建立,在開發(fā)數(shù)據(jù)庫之前,最好能夠花一定的時間,去制定一個數(shù)據(jù)庫對象 的前綴命名規(guī)范。如筆者在數(shù)據(jù)庫設(shè)計時, 喜歡跟前臺應(yīng)用程序協(xié)商, 確定合理的命名規(guī)范。 筆者最常用的是根據(jù)前臺應(yīng)用程序的模塊來定義后臺數(shù)據(jù)庫對象前綴名。如跟物料
9、管理模塊相關(guān)的表可以用 M 為前綴;而以訂單管理相關(guān)的,則可以利用 C 作為前綴。具體采用什么前 綴可以以用戶的愛好而定義。 但是, 需要注意的是, 這個命名規(guī)范應(yīng)該在數(shù)據(jù)庫管理員與前 臺應(yīng)用程序開發(fā)者之間達成共識,并且嚴格按照這個命名規(guī)范來定義對象名。其次,表、視圖、函數(shù)等最好也有統(tǒng)一的前綴。如視圖可以用V 為前綴,而函數(shù)則可以利用 F 為前綴。如此數(shù)據(jù)庫管理員無論是在日常管理還是對象引用的時候,都能夠在最短 的時間內(nèi)找到自己所需要的對象。要求五:盡量只存儲單一實體類型的數(shù)據(jù)這里將的實體類型跟數(shù)據(jù)類型不是一回事,要注意區(qū)分。這里講的實體類型是指所需要 描述對象的本身。筆者舉一個例子, 估計大
10、家就可以明白其中的內(nèi)容了。 如現(xiàn)在有一個圖書 館里系統(tǒng), 有圖書基本信息、 作者信息兩個實體對象。若用戶要把這兩個實體對象信息放在 同一張表中也是可以的。 如可以把表設(shè)計成圖書名字、圖書作者等等??墒侨绱嗽O(shè)計的話, 會給后續(xù)的維護帶來不少的麻煩。如當(dāng)后續(xù)有圖書出版時, 則需要為每次出版的圖書增加作者信息, 這無疑會增加額外的 存儲空間, 也3/ 10會增加記錄的長度。而且若作者的情況有所改變,如住址改變了以后,則還需 要去更改每本書的記錄。 同時,若這個作者的圖書從數(shù)據(jù)庫中全部刪除之后,這個作者的信息也就蕩然無存了。很明顯,這不符合數(shù)據(jù)庫設(shè)計規(guī)范化的需求。遇到這種情況時, 筆者建議可以把上面這
11、張表分解成三種獨立的表, 分別為圖書基本信 息表、 作者基本信息表、 圖書與作者對應(yīng)表等等。 如此設(shè)計以后, 以上遇到的所有問題就都 引刃而解了。以上五條是在數(shù)據(jù)庫設(shè)計時達到規(guī)范化水平的基本要求。 除了這些另外還有很多細節(jié)方 面的要求,如數(shù)據(jù)類型、存儲過程等等。而且,數(shù)據(jù)庫規(guī)范往往沒有技術(shù)方面的嚴格限制, 主要依靠數(shù)據(jù)庫管理員日常工作經(jīng)驗的累積。數(shù)據(jù)庫設(shè)計中的反規(guī)范技術(shù)探討1.數(shù)據(jù)庫設(shè)計簡述數(shù)據(jù)庫設(shè)計是把現(xiàn)實世界的商業(yè)模型與需求轉(zhuǎn)換成數(shù)據(jù)庫的模型的過程, 它是建立數(shù)據(jù) 庫應(yīng)用系統(tǒng)的核心問題。 設(shè)計的關(guān)鍵是如何使設(shè)計的數(shù)據(jù)庫能合理地存儲用戶的數(shù)據(jù), 方便 用戶進行數(shù)據(jù)處理。數(shù)據(jù)庫設(shè)計完全是人的問
12、題,而不是數(shù)據(jù)庫管理系統(tǒng)的問題。系統(tǒng)不管設(shè)計是好是壞, 照樣運行。 數(shù)據(jù)庫設(shè)計應(yīng)當(dāng)由數(shù)據(jù)庫管理員和系統(tǒng)分析員一起和用戶一道工作,了解各個用 戶的要求,共同為整個數(shù)據(jù)庫做出恰當(dāng)?shù)?、完整的設(shè)計。數(shù)據(jù)庫及其應(yīng)用的性能和調(diào)優(yōu)都是建立在良好的數(shù)據(jù)庫設(shè)計的基礎(chǔ)上, 數(shù)據(jù)庫的數(shù)據(jù)是 一切操作的基礎(chǔ), 如果數(shù)據(jù)庫設(shè)計不好, 則其它一切調(diào)優(yōu)方法提高數(shù)據(jù)庫性能的效果都是有 限的。數(shù)據(jù)的規(guī)范化1.1.范式概述規(guī)范化理論是研究如何將一個不好的關(guān)系模式轉(zhuǎn)化為好的關(guān)系模式的理論, 規(guī)范化理論 是圍繞范式而建立的。 規(guī)范化理論認為, 一個關(guān)系數(shù)據(jù)庫中所有的關(guān)系, 都應(yīng)滿足一定的規(guī) 范(約束條件 )。規(guī)范化理論把關(guān)系應(yīng)滿足的
13、規(guī)范要求分為幾級,滿足最低要求的一級叫做第 一范式(1NF),在第一范式的基礎(chǔ)上提出了第二范式(2NF),在第二范式的基礎(chǔ)上又提出了第三范式(3NF),以后又提出了 BCNF 范式,4NF, 5NF。范式的等級越高,應(yīng)滿足的約束集條 件也越嚴格。規(guī)范的每一級別都依賴于它的前一級別,例如若一個關(guān)系模式滿足2NF,則一定滿足 1NF。下面我們只介紹 1NF,2NF,3NF 范式。1.2.1NF1NF 是關(guān)系模型的最低要求,它的規(guī)則是:每一列必須是原子的,不能分成多個子列。每一行和列的位置只能有一個值。4/ 10不能具有多值列。例:如果要求一個學(xué)生一行,一個學(xué)生可選多門課,則下面的“學(xué)生”表就不滿足
14、1NF: student(s no,sname,classno)其中: s no 為學(xué)號, s name 為學(xué)生姓名, class no 為課程號。因為一個學(xué)生可 選多門課,所以列 classno 有多個值,所以空不符合 1NF。規(guī)范化就是把它分成如下兩個表: “學(xué)生”表和“選課”表,則這兩個表就都滿足 1NF 了。student(sno,s name)stu class(s no,class no)1.3.2NF對于滿足 2NF 的表,除滿足 1NF 夕卜,非主碼的列必須依賴于所有的主碼,而不是 組合主碼的一部分。如果滿足1NF 的表的主碼只有一列,則它自動滿足2NF。 例:下面的“選課”表
15、,不符合 2NF。stu class(s no,class no,classname)其中:class- name 為課程名稱。因為詞表的主碼是:(s no,class no),非主碼列class name 依賴于組合主碼的一部分 class no,所以它不符合 2NF。對該表規(guī)范化也是把它分解成兩個表: “選課”表和“課程”表,則它們就都滿足 2NF 了。stu class(s no,class no)class(class no,class name)1.4.3NF3NF 的規(guī)則是除滿足 2NF 外,任一非主碼列不能依賴于其它非主碼列。 例: 下面的“課程”表,不符合3NF。class(c
16、lass no,class name,teacher no,teacher name)其中: teacher no 為任課教師號, teacher name 為任課教師姓名。因為非主碼列 teacher name 依賴于另一非主碼列 teacher no,所以它不符合 3NF。其解決辦法也是把它分解成兩個表:“課程”表和 “教師”表,則它們就都滿足 3NF 了。class(class no,class name,teacherno)teacher(teacher no,teacher name)5/ 101.5.小結(jié)當(dāng)一個表是規(guī)范的, 則其非主碼列依賴于主碼列。 從關(guān)系模型的角度來看, 表滿足
17、 3NF 最符合標準,這樣的設(shè)計容易維護。一個完全規(guī)范化的設(shè)計并不總能生成最優(yōu)的性能, 因此通常是先按照 3NF 設(shè)計,如果有性能問題,再通過反規(guī)范來解決。數(shù)據(jù)庫中的數(shù)據(jù)規(guī)范化的優(yōu)點是減少了數(shù)據(jù)冗余, 節(jié)約了存儲空間, 相應(yīng)邏輯和物 理的 I/O 次數(shù)減少,同時加快了增、刪、改的速度,但是對完全規(guī)范的數(shù)據(jù)庫查詢,通常需 要更多的連接操作,從而影響查詢的速度。 因此, 有時為了提高某些查詢或應(yīng)用的性能而破 壞規(guī)范規(guī)則,即反規(guī)范。2.數(shù)據(jù)的反規(guī)范2.1.反規(guī)范的好處是否規(guī)范化的程度越高越好 ?這要根據(jù)需要來決定,因為“分離”越深,產(chǎn)生的關(guān) 系越多,關(guān)系過多, 連接操作越頻繁,而連接操作是最費時間的
18、, 特別對以查詢?yōu)橹鞯臄?shù)據(jù) 庫應(yīng)用來說,頻繁的連接會影響查詢速度。所以, 關(guān)系有時故意保留成非規(guī)范化的,或者規(guī) 范化以后又反規(guī)范了,這樣做通常是為了改進性能。例如帳戶系統(tǒng)中的“帳戶”表 B TB01,它的列 busi balanee(企業(yè)帳戶的總余額)就違反規(guī)范,其中的值可以通過下面的查詢獲得:select busi code,sum(acc balance)fromB TB06group by busi code如果 B TB01 中沒有該列,若想獲得 busi name(企業(yè)名稱)和企業(yè)帳戶的總余額,則需要做連接操作:select busi name,sum(acc balance)fro
19、m BTB01,B TB06where B TB01.busi code=BTB06.busi codegroup by busi code如果經(jīng)常做這種查詢,則就有必要在B TB01 中加入列 busi balanee,相應(yīng)的代價則是必須在表 B TB06 上創(chuàng)建增、刪、改的觸發(fā)器來維護 B TB01 表上 busi balanee 列 的值。類似的情況在決策支持系統(tǒng)中經(jīng)常發(fā)生。反規(guī)范的好處是降低連接操作的需求、 降低外碼和索引的數(shù)目, 還可能減少表的數(shù) 目,相應(yīng)帶來的問題是可能出現(xiàn)數(shù)據(jù)的完整性問題。加快查詢速度,但會降低修改速度。因 此決定做反規(guī)范時, 一定要權(quán)衡利弊, 仔細分析應(yīng)用的數(shù)據(jù)
20、存取需求和實際的性能特點, 好 的索引和其它方法經(jīng)常能夠解決性能問題,而不必采用反規(guī)范6/ 10這種方法。2.2.常用的反規(guī)范技術(shù)在進行反規(guī)范操作之前, 要充分考慮數(shù)據(jù)的存取需求、常用表的大小、一些特殊的 計算 (例如合計 )、數(shù)據(jù)的物理存儲位置等。常用的反規(guī)范技術(shù)有增加冗余列、增加派生列、 重新組表和分割表。2.2.1.增加冗余列增加冗余列是指在多個表中具有相同的列, 它常用來在查詢時避免連接操作。 例如 前面例子中,如果經(jīng)常檢索一門課的任課教師姓名,則需要做 class 和 teacher 表的連接查詢:seleet elass name,teaeher namefrom class,te
21、acherwhere class.teacher no=teacher.teacher no這樣的話就可以在 class 表中增加一列 teacher name 就不需要連接操作了。增加冗余列可以在查詢時避免連接操作, 但它需要更多的磁盤空間, 同時增加表維 護的工作量。2.2.2.增加派生列增加派生列指增加的列來自其它表中的數(shù)據(jù), 由它們計算生成。 它的作用是在查詢時減少連接操作,避免使用集函數(shù)。例如前面所講的賬戶系統(tǒng)中的表B TB01 的列 busibalance 就是派生列。派生列也具有與冗余列同樣的缺點。2.2.3.重新組表重新組表指如果許多用戶需要查看兩個表連接出來的結(jié)果數(shù)據(jù),則把這
22、兩個表重新 組成一個表來減少連接而提高性能。 例如,用戶經(jīng)常需要同時查看課程號, 課程名稱, 任課 教 師 號 , 任 課 教 師 姓 名 ,則 可 把 表 class(class no,class name,teacher no) 和 表 teacher(teacher no,teacher name)合并成一個表class(class no,class name,teacher no,teacher name) 。這樣可提高性能, 但需要更多的磁盤空間, 同時也損失了數(shù)據(jù)在概念上 的獨立性。2.2.4.分割表有時對表做分割可以提高性能。表分割有兩種方式:1 水平分割:根據(jù)一列或多列數(shù)據(jù)的值
23、把數(shù)據(jù)行放到兩個獨立的表中。水平 分割通常在下面的情況下使用 :A 表很大,分割后可以降低在查詢時需要讀的數(shù)據(jù)和索引的 頁數(shù), 同時也降低了索引的層數(shù), 提高查詢速度。 B 表中的數(shù)據(jù)本來就有獨立性, 例如表中 分別記錄各個地區(qū)的數(shù)據(jù)或不同時期的數(shù)據(jù), 特別是有些數(shù)據(jù)常用, 而另外一些數(shù)據(jù)不常用。 C 需要把數(shù)據(jù)存放到多個介質(zhì)上。 例如法規(guī)表 law 就可以分成兩個表7/ 10active law 和 in active law activea authors 表中的內(nèi)容是正生效的法規(guī),是經(jīng)常使用的,而 inactive law表則使已經(jīng)作廢的法規(guī), 不常被查詢。 水平分割會給應(yīng)用增加復(fù)雜度,
24、 它通常在查詢時需要 多個表名,查詢所有數(shù)據(jù)需要 union 操作。在許多數(shù)據(jù)庫應(yīng)用中,這種復(fù)雜性會超過它帶來 的優(yōu)點,因為只要索引關(guān)鍵字不大, 則在索引用于查詢時,表中增加兩到三倍數(shù)據(jù)量, 查詢 時也就增加讀一個索引層的磁盤次數(shù)。2 垂直分割: 把主碼和一些列放到一個表, 然后把主碼和另外的列放到另一個表中。 如果一個表中某些列常用, 而另外一些列不常用, 則可以采用垂直分割, 另外垂直分割可以 使得數(shù)據(jù)行變小,一個數(shù)據(jù)頁就能存放更多的數(shù)據(jù),在查詢時就會減少I/O 次數(shù)。其缺點是需要管理冗余列,查詢所有數(shù)據(jù)需要 join 操作。3.反規(guī)范技術(shù)需要維護數(shù)據(jù)的完整性無論使用何種反規(guī)范技術(shù),都需要
25、一定的管理來維護數(shù)據(jù)的完整性,常用的方法是 批處理維護、應(yīng)用邏輯和觸發(fā)器。批處理維護是指對復(fù)制列或派生列的修改積累一定的時間 后,運行一批處理作業(yè)或存儲過程對復(fù)制或派生列進行修改,這只能在對實時性要求不高的情況下使用。 數(shù)據(jù)的完整性也可由應(yīng)用邏輯來實現(xiàn), 這就要求必須在同一事務(wù)中對所有涉及 的表進行增、刪、改操作。用應(yīng)用邏輯來實現(xiàn)數(shù)據(jù)的完整性風(fēng)險較大, 因為同一邏輯必須在 所有的應(yīng)用中使用和維護, 容易遺漏,特別是在需求變化時,不易于維護。 另一種方式就是使用觸發(fā)器,對數(shù)據(jù)的任何修改立即觸發(fā)對復(fù)制列或派生列的相應(yīng)修改。觸發(fā)器是實時的,而且相應(yīng)的處理邏輯只在一個地方出現(xiàn), 易于維護。 一般來說,
26、 是解決這類問題的最好的辦 法。4.結(jié)束語數(shù)據(jù)庫的反規(guī)范設(shè)計可以提高查詢性能。 常用的反規(guī)范技術(shù)有增加冗余列、 增加派 生列、 重新組表和分割表。但反規(guī)范技術(shù)需要維護數(shù)據(jù)的完整性。 因此在做反規(guī)范時, 一定 要權(quán)衡利弊,仔細分析應(yīng)用的數(shù)據(jù)存取需求和實際的性能特點。Oracle 數(shù)據(jù)庫設(shè)計階段性能優(yōu)化策略通過對 Oracle 數(shù)據(jù)庫系統(tǒng)物理結(jié)構(gòu)和邏輯結(jié)構(gòu)的分析,闡述了在 Oralce 數(shù)據(jù)庫設(shè)計開 發(fā)階段性能優(yōu)化的一些策略和方法。Oracle 是目前使用最為廣泛的大型數(shù)據(jù)庫管理系統(tǒng),提高 Oracle 數(shù)據(jù)庫系統(tǒng)的運行效 率,是整個計算機信息系統(tǒng)高效運轉(zhuǎn)的前提和保證。影響 Oracle 數(shù)據(jù)庫應(yīng)
27、用系統(tǒng)性能的因 素很多,既有軟件方面的因素, 也包括數(shù)據(jù)運行的硬件環(huán)境、網(wǎng)絡(luò)環(huán)境、 數(shù)據(jù)庫管理和維護 方面的因素等。 數(shù)據(jù)庫系統(tǒng)設(shè)計開發(fā)階段是 Oracle 應(yīng)用優(yōu)化的最佳階段,也是主動優(yōu)化階 段,能達到以最小成本獲得最大性能增益的目的。通過對其邏輯存儲結(jié)構(gòu)和物理存儲結(jié)構(gòu)設(shè) 計進行優(yōu)化, 使之在滿足需求條件下, 時空開銷性能最佳, 可以解決數(shù)據(jù)庫系統(tǒng)運行過程中 性能的漸進性下降或性能突降等問題,以保證系統(tǒng)運行的優(yōu)良性能。Oracle 數(shù)據(jù)庫的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)Oracle 數(shù)據(jù)庫的邏輯結(jié)構(gòu)是由一些數(shù)據(jù)庫對象組成,如數(shù)據(jù)庫表空間、表、索引、段、視圖、存儲過程、觸發(fā)器等。數(shù)據(jù)庫的邏輯存儲結(jié)構(gòu)(表空
28、間等 )決定了數(shù)據(jù)庫的物理空間是8/ 10如何被使用的,數(shù)據(jù)庫對象如表、索引等分布在各個表空間中。Oracle 數(shù)據(jù)庫的物理結(jié)構(gòu)從操作系統(tǒng)一級查看, 是由一個個的文件組成, 從物理上可 劃分為: 數(shù)據(jù)文件、日志文件、控制文件和參數(shù)文件。數(shù)據(jù)文件中存放了所有的數(shù)據(jù)信息 日志文件存放數(shù)據(jù)庫運行期間產(chǎn)生的日志信息, 它被重復(fù)覆蓋使用, 若不采用歸檔方式的話, 已被覆蓋的日志信息將無法恢復(fù); 控制文件記錄了整個數(shù)據(jù)庫的關(guān)鍵結(jié)構(gòu)信息, 它若被破壞, 整個數(shù)據(jù)庫將無法工作和恢復(fù);參數(shù)文件中設(shè)置了很多 Oracle 數(shù)據(jù)庫的配置參數(shù),當(dāng)數(shù)據(jù) 庫啟動時,會讀取這些信息。邏輯結(jié)構(gòu)的優(yōu)化邏輯結(jié)構(gòu)優(yōu)化用通俗的話來說
29、就是通過增加、減少或調(diào)整邏輯結(jié)構(gòu)來提高應(yīng)用的效率, 下面通過對基本表的設(shè)計及索引、聚簇的討論來分析ORACLE 邏輯結(jié)構(gòu)的優(yōu)化。1、基本表擴展 :數(shù)據(jù)庫性能包括存儲空間需求量的大小和查詢響應(yīng)時間的長短兩個方面。為了優(yōu)化數(shù)據(jù)庫性能, 需要對數(shù)據(jù)庫中的表進行規(guī)范化。 一般來說, 邏輯數(shù)據(jù)庫設(shè)計滿足第三范式的表結(jié) 構(gòu)容易維護且基本滿足實際應(yīng)用的要求。 所以,實際應(yīng)用中一般都按照第三范式的標準進行 規(guī)范化, 從而保證了數(shù)據(jù)庫的一致性和完整性, 設(shè)計人員往往會設(shè)計過多的表間關(guān)聯(lián), 以盡 可能地降低數(shù)據(jù)冗余。但在實際應(yīng)用中這種做法有時不利于系統(tǒng)運行性能的優(yōu)化:如過程從 多表獲取數(shù)據(jù)時引發(fā)大量的連接操作,
30、在需要部分數(shù)據(jù)時要掃描整個表等, 這都消耗了磁盤 的 I/O 和 CPU 時間。為解決這一問題, 在設(shè)計表時應(yīng)同時考慮對某些表進行反規(guī)范化, 方法有以下幾種: 一 是分割表。分割表可分為水平分割表和垂直分割表兩種: 水平分割是按照行將一個表分割為多個表,這可以提高每個表的查詢速度, 但查詢、 更新時要選擇不同的表, 統(tǒng)計時要匯總多 個表, 因此應(yīng)用程序會更復(fù)雜。 垂直分割是對于一個列很多的表, 若某些列的訪問頻率遠遠 高于其它列, 就可以將主鍵和這些列作為一個表,將主鍵和其它列作為另外一個表。通過減 少列的寬度,增加了每個數(shù)據(jù)頁的行數(shù),一次 I/O就可以掃描更多的行,從而提高了訪問每 一個表的
31、速度。 但是由于造成了多表連接, 所以應(yīng)該在同時查詢或更新不同分割表中的列的 情況比較少的情況下使用。 二是保留冗余列。 當(dāng)兩個或多個表在查詢中經(jīng)常需要連接時,可以在其中一個表上增加若干冗余的列, 以避免表之間的連接過于頻繁, 一般在冗余列的數(shù)據(jù) 不經(jīng)常變動的情況下使用。 三是增加派生列。 派生列是由表中的其它多個列的計算所得,增加派生列可以減少統(tǒng)計運算,在數(shù)據(jù)匯總時可以大大縮短運算時間。因此, 在數(shù)據(jù)庫的設(shè)計中, 數(shù)據(jù)應(yīng)當(dāng)按兩種類別進行組織: 頻繁訪問的數(shù)據(jù)和頻繁修改 的數(shù)據(jù)。 對于頻繁訪問但是不頻繁修改的數(shù)據(jù), 內(nèi)部設(shè)計應(yīng)當(dāng)物理不規(guī)范化。 對于頻繁修改 但并不頻繁訪問的數(shù)據(jù), 內(nèi)部設(shè)計應(yīng)當(dāng)
32、物理規(guī)范化。有時還需將規(guī)范化的表作為邏輯數(shù)據(jù)庫 設(shè)計的基礎(chǔ),然后再根據(jù)整個應(yīng)用系統(tǒng)的需要,物理地非規(guī)范化數(shù)據(jù)。規(guī)范與反規(guī)范都是建 立在實際的操作基礎(chǔ)之上的約束,脫離了實際兩者都沒有意義。只有把兩者合理地結(jié)合在一 起,才能相互補充,發(fā)揮各自的優(yōu)點。2、索引和聚簇 :創(chuàng)建索引是提高檢索效率最有效的方法之一,索引把表中的邏輯值映射到安全的RowID,能快速定位數(shù)據(jù)的物理地址,可以大大加快數(shù)據(jù)庫的查詢速度,一個建有合理索引 的數(shù)據(jù)庫應(yīng)用系統(tǒng)9/ 10可能比一個沒有建立索引的數(shù)據(jù)庫應(yīng)用系統(tǒng)效率高幾十倍,但并不是索引越多越好,在那些經(jīng)常需要修改的數(shù)據(jù)列上建立索引,將導(dǎo)致索引B*樹的不斷重組,造成系統(tǒng)性能的
33、下降和存儲空間的浪費。 對于一個大型表建立的索引, 有時并不能改善數(shù)據(jù)查詢 速度,反而會影響整個數(shù)據(jù)庫的性能。 這主要是和 SGA 的數(shù)據(jù)管理方式有關(guān),Oracle 在進行 數(shù)據(jù)塊高速緩存管理時,索引數(shù)據(jù)比普通數(shù)據(jù)具有更高的駐留權(quán)限,在進行空間競爭時, Oracle 會先移出普通數(shù)據(jù), 對建有索引的大型表進行數(shù)據(jù)查詢時, 索引數(shù)據(jù)可能會用完所有 的數(shù)據(jù)塊緩存空間, Oracle 不得不頻繁地進行磁盤讀寫來獲取數(shù)據(jù),所以,在對一個大型表 進行分區(qū)之后,可以根據(jù)相應(yīng)的分區(qū)建立分區(qū)索引。Oracle 提供了另一種方法來提高查詢速度,就是聚簇(Cluster)。所謂聚簇,簡單地說就是把幾個表放在一起, 按一定公共屬性混合存放。 聚簇根據(jù)共同碼值將多個表的數(shù)據(jù)存儲在 同一個 Oracle 塊中,這時檢索一組 Oracle 塊就同時得到兩個表的數(shù)據(jù),這樣就可以減少需 要存儲的 Oracle 塊,從而提高應(yīng)用程序的性能。對于邏輯結(jié)構(gòu)的優(yōu)化, 還應(yīng)將表數(shù)據(jù)和索引數(shù)據(jù)分開表空間存儲, 分別使用獨立的表空 間。因為如果將表數(shù)據(jù)和索引數(shù)據(jù)放在一起,表數(shù)據(jù)的 I/O 操作和索引的 I/O 操作將產(chǎn)生影 響系統(tǒng)性能的 I/O 競爭,降低系統(tǒng)的響應(yīng)效率。 將表數(shù)據(jù)和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商務(wù)公寓改造合同
- 2025年鎮(zhèn)流器塑料外殼行業(yè)深度研究分析報告
- 2025年度林業(yè)苗木種植賠償協(xié)議
- 2025年紙品項目可行性研究報告
- 社區(qū)商業(yè)活動組織與執(zhí)行策略
- 2025年度金融風(fēng)險管理師聘用合同
- 2025年度城鄉(xiāng)居民先診療后付費醫(yī)療保障協(xié)議
- 科技企業(yè)的知識產(chǎn)權(quán)管理與競爭策略
- 2025年度酒店式公寓租賃合同租金調(diào)整及家具配置補充協(xié)議
- 二零二五年度食品安全風(fēng)險代理合作協(xié)議
- 天然氣脫硫完整版本
- 2025年中國電子煙行業(yè)發(fā)展前景與投資戰(zhàn)略規(guī)劃分析報告
- 貨物學(xué)基礎(chǔ) 課件 項目一 任務(wù)一 貨物的基本概念
- 無人機法律法規(guī)與安全飛行 第2版空域管理
- 我的小學(xué)生活
- 團會:紀念一二九運動
- 《商務(wù)溝通-策略、方法與案例》課件 第三章 書面溝通
- 2024具身大模型關(guān)鍵技術(shù)與應(yīng)用報告-哈爾濱工業(yè)大學(xué)
- 提高瓦屋面太陽能板安裝一次驗收合格率
- 2024上海市房屋租賃合同范本下載
- 安徽省六安市裕安區(qū)六安市獨山中學(xué)2024-2025學(xué)年高一上學(xué)期11月期中生物試題(含答案)
評論
0/150
提交評論