欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

數(shù)據(jù)庫(kù)性能優(yōu)化二:數(shù)據(jù)庫(kù)表優(yōu)化提升性能

 更新時(shí)間:2013年01月02日 10:14:56   作者:  
數(shù)據(jù)庫(kù)表優(yōu)化包括:設(shè)計(jì)規(guī)范化表、消除數(shù)據(jù)冗余、適當(dāng)?shù)娜哂?、增加?jì)算列、索引、主鍵和外鍵的必要性等等,需要了解的朋友可以參考下
數(shù)據(jù)庫(kù)優(yōu)化包含以下三部分,數(shù)據(jù)庫(kù)自身的優(yōu)化,數(shù)據(jù)庫(kù)表優(yōu)化,程序操作優(yōu)化.此文為第二部分 

優(yōu)化①:設(shè)計(jì)規(guī)范化表,消除數(shù)據(jù)冗余
數(shù)據(jù)庫(kù)范式是確保數(shù)據(jù)庫(kù)結(jié)構(gòu)合理,滿足各種查詢需要、避免數(shù)據(jù)庫(kù)操作異常的數(shù)據(jù)庫(kù)設(shè)計(jì)方式。滿足范式要求的表,稱為規(guī)范化表,范式產(chǎn)生于20世紀(jì)70年代初,一般表設(shè)計(jì)滿足前三范式就可以,在這里簡(jiǎn)單介紹一下前三范式
先給大家看一下百度百科給出的定義:
第一范式(1NF)無(wú)重復(fù)的列
所謂第一范式(1NF)是指在關(guān)系模型中,對(duì)域添加的一個(gè)規(guī)范要求,所有的域都應(yīng)該是原子性的,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。
第二范式(2NF)屬性
在1NF的基礎(chǔ)上,非碼屬性必須完全依賴于碼[在1NF基礎(chǔ)上消除非主屬性對(duì)主碼的部分函數(shù)依賴]
第三范式(3NF)屬性
在1NF基礎(chǔ)上,任何非主屬性不依賴于其它非主屬性[在2NF基礎(chǔ)上消除傳遞依賴]
通俗的給大家解釋一下(可能不是最科學(xué)、最準(zhǔn)確的理解)
第一范式:屬性(字段)的原子性約束,要求屬性具有原子性,不可再分割;
第二范式:記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),每條記錄需要有一個(gè)屬性來(lái)做為實(shí)體的唯一標(biāo)識(shí)。
第三范式:屬性(字段)冗余性的約束,即任何字段不能由其他字段派生出來(lái),在通俗點(diǎn)就是:主鍵沒(méi)有直接關(guān)系的數(shù)據(jù)列必須消除(消除的辦法就是再創(chuàng)建一個(gè)表來(lái)存放他們,當(dāng)然外鍵除外)
如果數(shù)據(jù)庫(kù)設(shè)計(jì)達(dá)到了完全的標(biāo)準(zhǔn)化,則把所有的表通過(guò)關(guān)鍵字連接在一起時(shí),不會(huì)出現(xiàn)任何數(shù)據(jù)的復(fù)本(repetition)。標(biāo)準(zhǔn)化的優(yōu)點(diǎn)是明顯的,它避免了數(shù)據(jù)冗余,自然就節(jié)省了空間,也對(duì)數(shù)據(jù)的一致性(consistency)提供了根本的保障,杜絕了數(shù)據(jù)不一致的現(xiàn)象,同時(shí)也提高了效率。
優(yōu)化②:適當(dāng)?shù)娜哂?,增加?jì)算列
數(shù)據(jù)庫(kù)設(shè)計(jì)的實(shí)用原則是:在數(shù)據(jù)冗余和處理速度之間找到合適的平衡點(diǎn)
滿足范式的表一定是規(guī)范化的表,但不一定是最佳的設(shè)計(jì)。很多情況下會(huì)為了提高數(shù)據(jù)庫(kù)的運(yùn)行效率,常常需要降低范式標(biāo)準(zhǔn):適當(dāng)增加冗余,達(dá)到以空間換時(shí)間的目的。比如我們有一個(gè)表,產(chǎn)品名稱,單價(jià),庫(kù)存量,總價(jià)值。這個(gè)表是不滿足第三范式的,因?yàn)椤翱們r(jià)值”可以由“單價(jià)”乘以“數(shù)量”得到,說(shuō)明“金額”是冗余字段。但是,增加“總價(jià)值”這個(gè)冗余字段,可以提高查詢統(tǒng)計(jì)的速度,這就是以空間換時(shí)間的作法。合理的冗余可以分散數(shù)據(jù)量大的表的并發(fā)壓力,也可以加快特殊查詢的速度,冗余字段可以有效減少數(shù)據(jù)庫(kù)表的連接,提高效率。
其中"總價(jià)值"就是一個(gè)計(jì)算列,在數(shù)據(jù)庫(kù)中有兩種類(lèi)型:數(shù)據(jù)列和計(jì)算列,數(shù)據(jù)列就是需要我們手動(dòng)或者程序給予賦值的列,計(jì)算列是源于表中其他的數(shù)據(jù)計(jì)算得來(lái),比如這里的"總價(jià)值"
在SQL中創(chuàng)建計(jì)算列:
復(fù)制代碼 代碼如下:

create table table1
(
number decimal(18,4),
price money,
Amount as number*price --這里就是計(jì)算列
)

也可以再表設(shè)計(jì)中,直接手動(dòng)添加或修改列屬性即可:如下圖
 
是否持久性,我們也需要注意:
如果是'否',說(shuō)明這列是虛擬列,每次查詢的時(shí)候計(jì)算一次,而且那么它是不可以用來(lái)做check,foreign key或not null約束。
如果是'是',就是真實(shí)的列,不需要每次都計(jì)算,可以再此列上創(chuàng)建索引等等。
優(yōu)化③:索引
索引是一個(gè)表優(yōu)化的重要指標(biāo),在表優(yōu)化中占有極其重要的成分,所以將單獨(dú)寫(xiě)一章”SQL索引一步到位“去告訴大家如何建立和優(yōu)化索引
優(yōu)化④:主鍵和外鍵的必要性
主鍵與外鍵的設(shè)計(jì),在全局?jǐn)?shù)據(jù)庫(kù)的設(shè)計(jì)中,占有重要地位。 因?yàn)椋褐麈I是實(shí)體的抽象,主鍵與外鍵的配對(duì),表示實(shí)體之間的連接。
主鍵:根據(jù)第二范式,需要有一個(gè)字段去標(biāo)識(shí)這條記錄,主鍵無(wú)疑是最好的標(biāo)識(shí),但是很多表也不一定需要主鍵,但是對(duì)于數(shù)據(jù)量大,查詢頻繁的數(shù)據(jù)庫(kù)表,一定要有主鍵,主鍵可以增加效率、防止重復(fù)等優(yōu)點(diǎn)。
主鍵的選擇也比較重要,一般選擇總的長(zhǎng)度小的鍵,小的鍵的比較速度快,同時(shí)小的鍵可以使主鍵的B樹(shù)結(jié)構(gòu)的層次更少。
主鍵的選擇還要注意組合主鍵的字段次序,對(duì)于組合主鍵來(lái)說(shuō),不同的字段次序的主鍵的性能差別可能會(huì)很大,一般應(yīng)該選擇重復(fù)率低、單獨(dú)或者組合查詢可能性大的字段放在前面。
外鍵:外鍵作為數(shù)據(jù)庫(kù)對(duì)象,很多人認(rèn)為麻煩而不用,實(shí)際上,外鍵在大部分情況下是很有用的,理由是:外鍵是最高效的一致性維護(hù)方法
數(shù)據(jù)庫(kù)的一致性要求,依次可以用外鍵、CHECK約束、規(guī)則約束、觸發(fā)器、客戶端程序,一般認(rèn)為,離數(shù)據(jù)越近的方法效率越高。
謹(jǐn)慎使用級(jí)聯(lián)刪除和級(jí)聯(lián)更新,級(jí)聯(lián)刪除和級(jí)聯(lián)更新作為SQL SERVER 2000當(dāng)年的新功能,在2005作了保留,應(yīng)該有其可用之處。我這里說(shuō)的謹(jǐn)慎,是因?yàn)榧?jí)聯(lián)刪除和級(jí)聯(lián)更新有些突破了傳統(tǒng)的關(guān)于外鍵的定義,功能有點(diǎn)太過(guò)強(qiáng)大,使用前必須確定自己已經(jīng)把握好其功能范圍,否則,級(jí)聯(lián)刪除和級(jí)聯(lián)更新可能讓你的數(shù)據(jù)莫名其妙的被修改或者丟失。從性能看級(jí)聯(lián)刪除和級(jí)聯(lián)更新是比其他方法更高效的方法。
優(yōu)化⑤:存儲(chǔ)過(guò)程、視圖、函數(shù)的適當(dāng)使用
很多人習(xí)慣將復(fù)雜操作都放在應(yīng)用程序?qū)樱绻阋獌?yōu)化數(shù)據(jù)訪問(wèn)性能,將SQL代碼移植到數(shù)據(jù)庫(kù)上(使用存儲(chǔ)過(guò)程,視圖,函數(shù)和觸發(fā)器)也是一個(gè)很大的改進(jìn)原因如下:
1. 存儲(chǔ)過(guò)程減少了網(wǎng)絡(luò)傳輸、處理及存儲(chǔ)的工作量,且經(jīng)過(guò)編譯和優(yōu)化,執(zhí)行速度快,易于維護(hù),且表的結(jié)構(gòu)改變時(shí),不影響客戶端的應(yīng)用程序
2、使用存儲(chǔ)過(guò)程,視圖,函數(shù)有助于減少應(yīng)用程序中SQL復(fù)制的弊端,因?yàn)楝F(xiàn)在只在一個(gè)地方集中處理SQL
3、使用數(shù)據(jù)庫(kù)對(duì)象實(shí)現(xiàn)所有的TSQL有助于分析TSQL的性能問(wèn)題,同時(shí)有助于你集中管理TSQL代碼,更好的重構(gòu)TSQL代碼
優(yōu)化⑥:傳說(shuō)中的‘三少原則'
①:數(shù)據(jù)庫(kù)的表越少越好
②:表的字段越少越好
③:字段中的組合主鍵、組合索引越少越好
當(dāng)然這里的少是相對(duì)的,是減少數(shù)據(jù)冗余的重要設(shè)計(jì)理念。
優(yōu)化⑦:分割你的表,減小表尺寸
如果你發(fā)現(xiàn)某個(gè)表的記錄太多,例如超過(guò)一千萬(wàn)條,則要對(duì)該表進(jìn)行水平分割。水平分割的做法是,以該表主鍵的某個(gè)值為界線,將該表的記錄水平分割為兩個(gè)表。
如果你若發(fā)現(xiàn)某個(gè)表的字段太多,例如超過(guò)八十個(gè),則垂直分割該表,將原來(lái)的一個(gè)表分解為兩個(gè)表
優(yōu)化⑧:字段設(shè)計(jì)原則
字段是數(shù)據(jù)庫(kù)最基本的單位,其設(shè)計(jì)對(duì)性能的影響是很大的。需要注意如下:
A、數(shù)據(jù)類(lèi)型盡量用數(shù)字型,數(shù)字型的比較比字符型的快很多。
B、 數(shù)據(jù)類(lèi)型盡量小,這里的盡量小是指在滿足可以預(yù)見(jiàn)的未來(lái)需求的前提下的。
C、 盡量不要允許NULL,除非必要,可以用NOT NULL+DEFAULT代替。
D、少用TEXT和IMAGE,二進(jìn)制字段的讀寫(xiě)是比較慢的,而且,讀取的方法也不多,大部分情況下最好不用。
E、 自增字段要慎用,不利于數(shù)據(jù)遷移

相關(guān)文章

最新評(píng)論