版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.數(shù)據(jù)庫設(shè)計規(guī)范化的五個要求通常情況下, 可以從兩個方面來判斷數(shù)據(jù)庫是否設(shè)計的比較規(guī)范。一是看看是否擁有大量的窄表, 二是寬表的數(shù)量是否足夠的少。 若符合這兩個條件, 則可以說明這個數(shù)據(jù)庫的規(guī)范化水平還是比較高的。 當然這是兩個泛泛而談的指標。 為了達到數(shù)據(jù)庫設(shè)計規(guī)范化的要求,一般來說,需要符合以下五個要求。要求一:表中應(yīng)該避免可為空的列。雖然表中允許空列,但是,空字段是一種比較特殊的數(shù)據(jù)類型。數(shù)據(jù)庫在處理的時候,需要進行特殊的處理。 如此的話, 就會增加數(shù)據(jù)庫處理記錄的復(fù)雜性。當表中有比較多的空字段時,在同等條件下,數(shù)據(jù)庫處理的性能會降低許多。所以,雖然在數(shù)據(jù)庫表設(shè)計的時候,允許表中具有空字
2、段,但是,我們應(yīng)該盡量避免。若確實需要的話, 我們可以通過一些折中的方式,來處理這些空字段, 讓其對數(shù)據(jù)庫性能的影響降低到最少。一是通過設(shè)置默認值的形式,來避免空字段的產(chǎn)生。 如在一個人事管理系統(tǒng)中, 有時候身份證號碼字段可能允許為空。因為不是每個人都可以記住自己的身份證號碼。而在員工報到的時候,可能身份證沒有帶在身邊。所以,身份證號碼字段往往不能及時提供。為此,身份證號碼字段可以允許為空,以滿足這些特殊情況的需要。但是,在數(shù)據(jù)庫設(shè)計的時候,則可以做一些處理。如當用戶沒有輸入內(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ā)者的名字。如進銷存管理中,還需要對客戶的聯(lián)系人進行管理。有時候, 企業(yè)可能只知道客戶一個采購員的姓
4、名。 但是在必要的情況下,企業(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)生一系列的問題。如客戶的采購員流動性比較大,在一年內(nèi)換了六個采購員。 此時,在系統(tǒng)中該如何管理呢?難道
5、就建立六個聯(lián)系人字段?這不但會導(dǎo)致空字段的增加,還需要頻繁的更改數(shù)據(jù)庫表結(jié)構(gòu)。明顯,這么做是不合理的。也有人說,可以.直接修改采購員的名字呀。可是這么處理的話, 會把原先采購訂單上采購員的名字也改變了。因為采購單上客戶采購員信息在數(shù)據(jù)庫中存儲的不是采購員的名字,而只是采購員對應(yīng)的一個編號。 在編號不改而名字改變了的情況下,采購訂單上顯示的就是更改后的名字。這不利于時候的追蹤。所以,在數(shù)據(jù)庫設(shè)計的時候要盡量避免這種重復(fù)的值或者列的產(chǎn)生。筆者建議, 若數(shù)據(jù)庫管理員遇到這種情況,可以改變一下策略。如把客戶聯(lián)系人另外設(shè)置一張表。然后通過客戶 ID 把供應(yīng)商信息表跟客戶聯(lián)系人信息表連接起來。也就是說,盡
6、量將重復(fù)的值放置到一張獨立的表中進行管理。然后通過視圖或者其他手段把這些獨立的表聯(lián)系起來。要求三:表中記錄應(yīng)該有一個唯一的標識符。在數(shù)據(jù)庫表設(shè)計的時候,數(shù)據(jù)庫管理員應(yīng)該養(yǎng)成一個好習慣,用一個ID 號來唯一的標識行記錄,而不要通過名字、編號等字段來對紀錄進行區(qū)分。每個表都應(yīng)該有一個ID 列,任何兩個記錄都不可以共享同一個ID 值。另外,這個ID 值最好有數(shù)據(jù)庫來進行自動管理,而不要把這個任務(wù)給前臺應(yīng)用程序。否則的話,很容易產(chǎn)生ID 值不統(tǒng)一的情況。另外,在數(shù)據(jù)庫設(shè)計的時候,最好還能夠加入行號。如在銷售訂單管理中,ID 號是用戶不能夠維護的。但是,行號用戶就可以維護。如在銷售訂單的行中,用戶可以通
7、過調(diào)整行號的大小來對訂單行進行排序。通常情況下,ID 列是以1 為單位遞進的。但是,行號就要以 10 為單位累進。如此,正常情況下,行號就以10、 20、 30 依次擴展下去。若此時用戶需要把行號為30 的紀錄調(diào)到第一行顯示。此時, 用戶在不能夠更改ID 列的情況下, 可以更改行號來實現(xiàn)。如可以把行號改為1,在排序時就可以按行號來進行排序。如此的話,原來行號為 30 的紀錄現(xiàn)在行號變?yōu)榱?,就可以在第一行中顯示。這是在實際應(yīng)用程序設(shè)計中對 ID 列的一個有效補充。這個內(nèi)容在教科書上是沒有的。需要在實際應(yīng)用程序設(shè)計中,才會掌握到這個技巧。要求四:數(shù)據(jù)庫對象要有統(tǒng)一的前綴名。一個比較復(fù)雜的應(yīng)用系統(tǒng)
8、,其對應(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ù)庫對象前綴名。如跟物料管理模塊相關(guān)的表可以用M 為前綴 ; 而以訂單管理相關(guān)的,則可以利用C 作為前綴。具體采用什么前綴可以以用戶的愛好而定義。 但是,需要注意的是, 這個命名規(guī)范應(yīng)該在數(shù)據(jù)庫管理員與
9、前臺應(yīng)用程序開發(fā)者之間達成共識,并且嚴格按照這個命名規(guī)范來定義對象名。其次,表、視圖、函數(shù)等最好也有統(tǒng)一的前綴。如視圖可以用V 為前綴,而函數(shù)則可以利用 F 為前綴。 如此數(shù)據(jù)庫管理員無論是在日常管理還是對象引用的時候,都能夠在最短的時間內(nèi)找到自己所需要的對象。.要求五:盡量只存儲單一實體類型的數(shù)據(jù)。這里將的實體類型跟數(shù)據(jù)類型不是一回事, 要注意區(qū)分。 這里講的實體類型是指所需要描述對象的本身。 筆者舉一個例子, 估計大家就可以明白其中的內(nèi)容了。 如現(xiàn)在有一個圖書館里系統(tǒng), 有圖書基本信息、 作者信息兩個實體對象。 若用戶要把這兩個實體對象信息放在同一張表中也是可以的。如可以把表設(shè)計成圖書名字
10、、圖書作者等等??墒侨绱嗽O(shè)計的話,會給后續(xù)的維護帶來不少的麻煩。如當后續(xù)有圖書出版時, 則需要為每次出版的圖書增加作者信息, 這無疑會增加額外的存儲空間, 也會增加記錄的長度。而且若作者的情況有所改變,如住址改變了以后,則還需要去更改每本書的記錄。 同時,若這個作者的圖書從數(shù)據(jù)庫中全部刪除之后, 這個作者的信息也就蕩然無存了。很明顯,這不符合數(shù)據(jù)庫設(shè)計規(guī)范化的需求。遇到這種情況時, 筆者建議可以把上面這張表分解成三種獨立的表, 分別為圖書基本信息表、 作者基本信息表、 圖書與作者對應(yīng)表等等。 如此設(shè)計以后, 以上遇到的所有問題就都引刃而解了。以上五條是在數(shù)據(jù)庫設(shè)計時達到規(guī)范化水平的基本要求。
11、除了這些另外還有很多細節(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è)計完全是人的問題,而不是數(shù)據(jù)庫管理系統(tǒng)的問題。系統(tǒng)不管設(shè)計是好是壞,照樣運行。 數(shù)據(jù)庫設(shè)計應(yīng)當由數(shù)據(jù)庫管理員和系統(tǒng)分析員一起和用戶一道工作, 了解各個用戶的要求,共同為整個數(shù)據(jù)庫做出恰當?shù)?、完整的設(shè)計。數(shù)據(jù)庫及其應(yīng)用的性能和調(diào)
12、優(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)滿足的規(guī)范要求分為幾級,滿足最低要求的一級叫做第一范式 (1NF),在第一范式的基礎(chǔ)上提出了第二范式(2NF),在第二范式的基礎(chǔ)上又提出了第.三范式 (3NF),以后又提出了BCNF 范式, 4NF, 5NF。范式的等級越高,應(yīng)滿足
13、的約束集條件也越嚴格。規(guī)范的每一級別都依賴于它的前一級別,例如若一個關(guān)系模式滿足 2NF,則一定滿足 1NF。下面我們只介紹 1NF, 2NF,3NF 范式。1.2.1NF1NF 是關(guān)系模型的最低要求,它的規(guī)則是:每一列必須是原子的,不能分成多個子列。每一行和列的位置只能有一個值。不能具有多值列。例:如果要求一個學(xué)生一行,一個學(xué)生可選多門課,則下面的“學(xué)生”表就不滿足1NF: student(s no,s name,classno)其中: s no 為學(xué)號, s name 為學(xué)生姓名, class no 為課程號。因為一個學(xué)生可選多門課,所以列 classno 有多個值,所以空不符合 1NF。
14、規(guī)范化就是把它分成如下兩個表:“學(xué)生”表和“選課”表,則這兩個表就都滿足1NF 了。student(s no,s name)stu class(s no,class no)1.3.2NF對于滿足2NF 的表,除滿足1NF 外,非主碼的列必須依賴于所有的主碼,而不是組合主碼的一部分。如果滿足1NF 的表的主碼只有一列,則它自動滿足2NF。例:下面的“選課”表,不符合2NF。stu class(s no,class no,classname)其中: class name 為課程名稱。因為詞表的主碼是:(s no,class no),非主碼列class name 依賴于組合主碼的一部分classno
15、,所以它不符合2NF。對該表規(guī)范化也是把它分解成兩個表:“選課”表和“課程”表,則它們就都滿足2NF 了。stu class(s no,class no)class(class no,class name).1.4.3NF3NF 的規(guī)則是除滿足2NF 外,任一非主碼列不能依賴于其它非主碼列。例:下面的“課程”表,不符合3NF。class(class no,class name,teacher no,teacher name)其中: teacher no 為任課教師號, teacher name 為任課教師姓名。因為非主碼列teacher name 依賴于另一非主碼列teacher no,所以它
16、不符合3NF。其解決辦法也是把它分解成兩個表: “課程”表和“教師”表,則它們就都滿足3NF 了。class(class no,class name,teacher no)teacher(teacher no,teacher name)1.5.小結(jié)當一個表是規(guī)范的,則其非主碼列依賴于主碼列。從關(guān)系模型的角度來看,表滿足3NF 最符合標準,這樣的設(shè)計容易維護。一個完全規(guī)范化的設(shè)計并不總能生成最優(yōu)的性能,因此通常是先按照 3NF 設(shè)計,如果有性能問題,再通過反規(guī)范來解決。數(shù)據(jù)庫中的數(shù)據(jù)規(guī)范化的優(yōu)點是減少了數(shù)據(jù)冗余, 節(jié)約了存儲空間, 相應(yīng)邏輯和物理的 I/O 次數(shù)減少,同時加快了增、刪、改的速度,
17、但是對完全規(guī)范的數(shù)據(jù)庫查詢,通常需要更多的連接操作, 從而影響查詢的速度。 因此,有時為了提高某些查詢或應(yīng)用的性能而破壞規(guī)范規(guī)則,即反規(guī)范。2. 數(shù)據(jù)的反規(guī)范2.1.反規(guī)范的好處是否規(guī)范化的程度越高越好?這要根據(jù)需要來決定,因為“分離”越深,產(chǎn)生的關(guān)系越多,關(guān)系過多,連接操作越頻繁,而連接操作是最費時間的,特別對以查詢?yōu)橹鞯臄?shù)據(jù)庫應(yīng)用來說,頻繁的連接會影響查詢速度。所以,關(guān)系有時故意保留成非規(guī)范化的,或者規(guī)范化以后又反規(guī)范了, 這樣做通常是為了改進性能。 例如帳戶系統(tǒng)中的 “帳戶” 表 B TB01,它的列 busi balance(企業(yè)帳戶的總余額 )就違反規(guī)范,其中的值可以通過下面的查詢獲
18、得:select busi code,sum(acc balance)fromB TB06group by busi code如果 BTB01 中沒有該列,若想獲得busi name(企業(yè)名稱 )和企業(yè)帳戶的總余額,.則需要做連接操作:select busi name,sum(acc balance)from B TB01,B TB06where B TB01.busi code=BTB06.busi codegroup by busi code如果經(jīng)常做這種查詢,則就有必要在B TB01 中加入列busibalance,相應(yīng)的代價則是必須在表 B TB06 上創(chuàng)建增、刪、改的觸發(fā)器來維護 B
19、TB01 表上 busi balance 列的值。類似的情況在決策支持系統(tǒng)中經(jīng)常發(fā)生。反規(guī)范的好處是降低連接操作的需求、 降低外碼和索引的數(shù)目, 還可能減少表的數(shù)目,相應(yīng)帶來的問題是可能出現(xiàn)數(shù)據(jù)的完整性問題。加快查詢速度,但會降低修改速度。因此決定做反規(guī)范時, 一定要權(quán)衡利弊, 仔細分析應(yīng)用的數(shù)據(jù)存取需求和實際的性能特點, 好的索引和其它方法經(jīng)常能夠解決性能問題,而不必采用反規(guī)范這種方法。2.2.常用的反規(guī)范技術(shù)在進行反規(guī)范操作之前, 要充分考慮數(shù)據(jù)的存取需求、 常用表的大小、 一些特殊的計算 (例如合計 )、數(shù)據(jù)的物理存儲位置等。常用的反規(guī)范技術(shù)有增加冗余列、增加派生列、重新組表和分割表。2
20、.2.1.增加冗余列增加冗余列是指在多個表中具有相同的列,它常用來在查詢時避免連接操作。例如前面例子中, 如果經(jīng)常檢索一門課的任課教師姓名,則需要做 class 和 teacher 表的連接查詢:select class name,teacher namefromclass,teacherwhereclass.teacher no=teacher.teacher no這樣的話就可以在class 表中增加一列teacher name 就不需要連接操作了。增加冗余列可以在查詢時避免連接操作,但它需要更多的磁盤空間,同時增加表維護的工作量。2.2.2.增加派生列增加派生列指增加的列來自其它表中的數(shù)據(jù)
21、,由它們計算生成。它的作用是在查詢.時減少連接操作,避免使用集函數(shù)。例如前面所講的賬戶系統(tǒng)中的表B TB01 的列busibalance 就是派生列。派生列也具有與冗余列同樣的缺點。2.2.3.重新組表重新組表指如果許多用戶需要查看兩個表連接出來的結(jié)果數(shù)據(jù),則把這兩個表重新組成一個表來減少連接而提高性能。例如,用戶經(jīng)常需要同時查看課程號,課程名稱, 任課教 師 號 , 任 課 教 師 姓 名 , 則 可 把 表class(class no,class name,teacher no) 和 表teacher(teacher no,teacher name) 合并成一個表 class(class
22、no,class name,teacher no,teacher name)。這樣可提高性能, 但需要更多的磁盤空間, 同時也損失了數(shù)據(jù)在概念上的獨立性。2.2.4.分割表有時對表做分割可以提高性能。表分割有兩種方式:1 水平分割:根據(jù)一列或多列數(shù)據(jù)的值把數(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 就可以分成兩個表
23、active law 和inactive law 。activea authors 表中的內(nèi)容是正生效的法規(guī), 是經(jīng)常使用的, 而 inactive law表則使已經(jīng)作廢的法規(guī), 不常被查詢。 水平分割會給應(yīng)用增加復(fù)雜度, 它通常在查詢時需要多個表名,查詢所有數(shù)據(jù)需要union 操作。在許多數(shù)據(jù)庫應(yīng)用中,這種復(fù)雜性會超過它帶來的優(yōu)點,因為只要索引關(guān)鍵字不大,則在索引用于查詢時,表中增加兩到三倍數(shù)據(jù)量,查詢時也就增加讀一個索引層的磁盤次數(shù)。2 垂直分割:把主碼和一些列放到一個表,然后把主碼和另外的列放到另一個表中。如果一個表中某些列常用,而另外一些列不常用,則可以采用垂直分割,另外垂直分割可以使
24、得數(shù)據(jù)行變小,一個數(shù)據(jù)頁就能存放更多的數(shù)據(jù),在查詢時就會減少I/O 次數(shù)。其缺點是需要管理冗余列,查詢所有數(shù)據(jù)需要join 操作。3. 反規(guī)范技術(shù)需要維護數(shù)據(jù)的完整性無論使用何種反規(guī)范技術(shù),都需要一定的管理來維護數(shù)據(jù)的完整性,常用的方法是批處理維護、 應(yīng)用邏輯和觸發(fā)器。批處理維護是指對復(fù)制列或派生列的修改積累一定的時間后,運行一批處理作業(yè)或存儲過程對復(fù)制或派生列進行修改,這只能在對實時性要求不高的情況下使用。 數(shù)據(jù)的完整性也可由應(yīng)用邏輯來實現(xiàn), 這就要求必須在同一事務(wù)中對所有涉及的表進行增、刪、改操作。 用應(yīng)用邏輯來實現(xiàn)數(shù)據(jù)的完整性風險較大,因為同一邏輯必須在所有的應(yīng)用中使用和維護,容易遺漏,
25、特別是在需求變化時,不易于維護。 另一種方式就是使用觸發(fā)器,對數(shù)據(jù)的任何修改立即觸發(fā)對復(fù)制列或派生列的相應(yīng)修改。觸發(fā)器是實時的,而且相應(yīng)的處理邏輯只在一個地方出現(xiàn),易于維護。 一般來說, 是解決這類問題的最好的辦法。.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)化的一些策略和
26、方法。Oracle 是目前使用最為廣泛的大型數(shù)據(jù)庫管理系統(tǒng),提高Oracle 數(shù)據(jù)庫系統(tǒng)的運行效率,是整個計算機信息系統(tǒng)高效運轉(zhuǎn)的前提和保證。影響Oracle 數(shù)據(jù)庫應(yīng)用系統(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ù)庫的邏輯
27、結(jié)構(gòu)和物理結(jié)構(gòu)Oracle 數(shù)據(jù)庫的邏輯結(jié)構(gòu)是由一些數(shù)據(jù)庫對象組成,如數(shù)據(jù)庫表空間、表、索引、段、視圖、存儲過程、觸發(fā)器等。數(shù)據(jù)庫的邏輯存儲結(jié)構(gòu) (表空間等 )決定了數(shù)據(jù)庫的物理空間是如何被使用的,數(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ù)
28、文件中設(shè)置了很多Oracle 數(shù)據(jù)庫的配置參數(shù),當數(shù)據(jù)庫啟動時,會讀取這些信息。邏輯結(jié)構(gòu)的優(yōu)化邏輯結(jié)構(gòu)優(yōu)化用通俗的話來說就是通過增加、減少或調(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ù)冗余
29、。但在實際應(yīng)用中這種做法有時不利于系統(tǒng)運行性能的優(yōu)化:如過程從.多表獲取數(shù)據(jù)時引發(fā)大量的連接操作,在需要部分數(shù)據(jù)時要掃描整個表等,這都消耗了磁盤的 I/O 和 CPU 時間。為解決這一問題, 在設(shè)計表時應(yīng)同時考慮對某些表進行反規(guī)范化,方法有以下幾種:一是分割表。分割表可分為水平分割表和垂直分割表兩種:水平分割是按照行將一個表分割為多個表,這可以提高每個表的查詢速度,但查詢、 更新時要選擇不同的表, 統(tǒng)計時要匯總多個表, 因此應(yīng)用程序會更復(fù)雜。垂直分割是對于一個列很多的表,若某些列的訪問頻率遠遠高于其它列, 就可以將主鍵和這些列作為一個表,將主鍵和其它列作為另外一個表。通過減少列的寬度,增加了每
30、個數(shù)據(jù)頁的行數(shù),一次I/O 就可以掃描更多的行,從而提高了訪問每一個表的速度。 但是由于造成了多表連接,所以應(yīng)該在同時查詢或更新不同分割表中的列的情況比較少的情況下使用。 二是保留冗余列。 當兩個或多個表在查詢中經(jīng)常需要連接時,可以在其中一個表上增加若干冗余的列,以避免表之間的連接過于頻繁,一般在冗余列的數(shù)據(jù)不經(jīng)常變動的情況下使用。 三是增加派生列。 派生列是由表中的其它多個列的計算所得,增加派生列可以減少統(tǒng)計運算,在數(shù)據(jù)匯總時可以大大縮短運算時間。因此,在數(shù)據(jù)庫的設(shè)計中,數(shù)據(jù)應(yīng)當按兩種類別進行組織:頻繁訪問的數(shù)據(jù)和頻繁修改的數(shù)據(jù)。 對于頻繁訪問但是不頻繁修改的數(shù)據(jù),內(nèi)部設(shè)計應(yīng)當物理不規(guī)范化。
31、 對于頻繁修改但并不頻繁訪問的數(shù)據(jù), 內(nèi)部設(shè)計應(yīng)當物理規(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)可能比一個沒有建立索引的數(shù)據(jù)庫應(yīng)用系統(tǒng)效率高幾十倍,但并不是索引越多越好,在那些經(jīng)常需要修改的數(shù)據(jù)列上建立索引,將導(dǎo)致索引
32、B*樹的不斷重組,造成系統(tǒng)性能的下降和存儲空間的浪費。 對于一個大型表建立的索引, 有時并不能改善數(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 競爭,降低
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 警務(wù)室調(diào)解制度
- 用電基礎(chǔ)知識培訓(xùn)
- 2025高一政治期末模擬卷01(考試版)【測試范圍:必修1全冊+必修2全冊】(新高考用)含答案
- 醫(yī)院愛崗敬業(yè)培訓(xùn)課件
- 國考公安考試試題及答案
- 2026年上半年浙江杭州市婦產(chǎn)科醫(yī)院(杭州市婦幼保健院)高層次、緊缺專業(yè)人才招聘15人(總)備考考試試題附答案解析
- 2026某事業(yè)單位招聘保潔崗位1人備考考試題庫附答案解析
- JIS D 9101-2012 自行車術(shù)語標準 Cycles - Terminology
- 2026福建福州市平潭綜合實驗區(qū)黨工委黨校(區(qū)行政學(xué)院、區(qū)社會主義學(xué)院)招聘編外工作人員1人備考考試題庫附答案解析
- 2026福建龍巖鑫達彩印有限公司龍巖鑫利來酒店分公司(第一批)招聘3人參考考試試題附答案解析
- 2025屆高考小說專題復(fù)習-小說敘事特征+課件
- 部編版二年級下冊寫字表字帖(附描紅)
- 干部履歷表(中共中央組織部2015年制)
- GB/T 5657-2013離心泵技術(shù)條件(Ⅲ類)
- GB/T 3518-2008鱗片石墨
- GB/T 17622-2008帶電作業(yè)用絕緣手套
- GB/T 1041-2008塑料壓縮性能的測定
- 400份食物頻率調(diào)查問卷F表
- 滑坡地質(zhì)災(zāi)害治理施工
- 實驗動物從業(yè)人員上崗證考試題庫(含近年真題、典型題)
- 可口可樂-供應(yīng)鏈管理
評論
0/150
提交評論