陳 華
[摘要]數(shù)據(jù)庫系統(tǒng)作為現(xiàn)在商業(yè)應(yīng)用中極為廣泛的一種應(yīng)用,其建立和使用過程中是否將有限的資源最優(yōu)的利用,關(guān)系到用戶的滿意程度和企業(yè)的成本控制。數(shù)據(jù)庫調(diào)優(yōu)可以使數(shù)據(jù)庫應(yīng)用運行得更快,有更高得吞吐量和更短的響應(yīng)時間。介紹數(shù)據(jù)庫優(yōu)化的原理,接著討論幾種數(shù)據(jù)庫調(diào)優(yōu)的方法。
[關(guān)鍵詞]數(shù)據(jù)庫性能優(yōu)化
中圖分類號:TP3文獻標(biāo)識碼:A文章編號:1671-7597(2009)0610080-01
一、數(shù)據(jù)庫調(diào)優(yōu)的基本原則
(一)如何分配服務(wù)器端與客戶端的合理需求。數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)非常密集,要從這樣的系統(tǒng)中獲得令人滿意的性能,不僅僅要對系統(tǒng)的數(shù)據(jù)庫管理部分進行調(diào)優(yōu),考慮如何在數(shù)據(jù)庫系統(tǒng)(服務(wù)器)和應(yīng)用程序(客戶端)之間分配工作也是非常重要的。
首先是考慮客戶與服務(wù)器的相關(guān)計算資源是否充足。特別是在很多情況下,服務(wù)器都會過載,而其他部分都正常的工作,這時候部分的任務(wù)就應(yīng)該遷移到客戶端去。其次是相關(guān)信息的獲取,當(dāng)數(shù)據(jù)庫發(fā)生變化的時候系統(tǒng)應(yīng)該有些響應(yīng)。那么在應(yīng)用程序中進行的輪詢就應(yīng)該由內(nèi)部的觸發(fā)器代替。因為輪詢的辦法會定期地查看表是不是有變化,而觸發(fā)器僅僅在發(fā)生變化時被激發(fā),因此開銷就要小得多。而數(shù)據(jù)庫任務(wù)和其他任務(wù)是不是交互也很重要,如果存在交互,那么訪問屏幕的那部分應(yīng)該放在事務(wù)之外執(zhí)行,原因是屏幕交互會占用大量時間。如果某個事務(wù)持有時間片,那么它會阻止其他事務(wù)訪問它所持有的數(shù)據(jù)。
(二)減少啟動次數(shù)獲取性能優(yōu)化。數(shù)據(jù)庫所耗費的大量資源是用來啟動的。比如,在磁盤上開始一個讀操作是很耗時的,但是一旦開始,磁盤就能告訴地傳輸數(shù)據(jù)。每當(dāng)某個重要的查詢從包含成千上萬列的表中只查取少數(shù)幾列時,垂直劃分是個很好的策略。再比如,對查詢,即使是簡單查詢而言,解析、進行語義分析、選擇存取路徑的系統(tǒng)成本也是驚人的,一般都超過10000條指令,這就要求應(yīng)該事先編譯經(jīng)常執(zhí)行的查詢。總之,要用盡可能少的啟動次數(shù)來獲取最好的性能。
(三)解決系統(tǒng)瓶頸問題。大多數(shù)情況下,系統(tǒng)運行緩慢不是由于所有部件都飽和引起的,而是由于系統(tǒng)中的某個部分限制了整體的性能,這些部分稱為瓶頸。解決的策略首先局部調(diào)整(例如采用增加索引或者重寫查詢的方法,以便更好地利用現(xiàn)有索引),應(yīng)該首先考慮。第二個策略是進行劃分。數(shù)據(jù)庫系統(tǒng)中的劃分將負載分散到更多的資源上執(zhí)行,或者在時間上并行分配,從而減少某個部件上的負載量。在很多情況下劃分的確能解決瓶頸問題。事實上,劃分是在加速瓶頸所在部件無效的情況下才進行的。
二、數(shù)據(jù)庫的分類調(diào)優(yōu)
(一)事務(wù)處理過程的調(diào)優(yōu)。事務(wù)是數(shù)據(jù)庫應(yīng)用程序便于處理的事件部分。一般來說,開發(fā)者將事務(wù)處理方式看做原子的沒一個事務(wù)都會本隔離的執(zhí)行沒有任何并發(fā)動作。但遺憾的是,應(yīng)用程序中的事物序列本質(zhì)上是一個整體,上面提到的原子性保證是不存在的。和設(shè)計操作系統(tǒng)時常常遇到的問題一樣,在一個應(yīng)用程序執(zhí)行的兩個事務(wù)之間,可能會有另外一個應(yīng)用程序的事務(wù)執(zhí)行,而且后者很可能修改可前者兩個事務(wù)需要訪問的數(shù)據(jù)項。從這里可以看出,事務(wù)短一點會更容易避免這樣的情況。那么是不是就把事物切分成盡量小的粒度以提高執(zhí)行效率呢?從上面來看是的,但遺憾的是,這樣做會破壞執(zhí)行的正確性。這種性能和正確性之間的矛盾充斥著和并發(fā)控制有關(guān)的調(diào)優(yōu)過程。在這種情況下,在考慮事務(wù)的性能的時候有幾點調(diào)優(yōu)選項如下:
1、事務(wù)使用的鎖的個數(shù)和性能成反比;2、讀鎖是對性能最有利的鎖:3、事務(wù)持有鎖的時間越短,性能越好。
(二)索引調(diào)優(yōu)泛談。索引是建立在表上的一種數(shù)據(jù)組織,它能提高訪問表中一條或者多條記錄的特定查詢效率。因此,適當(dāng)?shù)乃饕{(diào)優(yōu)是很重要的,未經(jīng)調(diào)優(yōu)的索引可能導(dǎo)致很多不良后果,比如:建立一個索引卻從不使用,僅僅付出維護的代價;為了返回單一的記錄而掃描多個文件;由于存在錯誤的索引,導(dǎo)致多表的連接操作持續(xù)幾個小時的時間。
索引對數(shù)據(jù)庫的性能影響:1、表掃描需要訪問大量數(shù)據(jù)頁,而索引可以避免表掃描,從而使每次查詢只需訪問索引頁和少量的數(shù)據(jù)頁即可;2、對于某些查詢,數(shù)據(jù)可以從索引中獲得,而無需訪問數(shù)據(jù)庫(索引覆蓋):3、由于聚簇索引的插入是在數(shù)據(jù)頁上分布進行的,因而避免了將表的最后一頁作為“熱點”進行大量的插入操作(Sybase):4、如果索引的順序與order by子句的順序相同,則通過索引查詢可以避免排序的過程;5、索引(唯一索引)還可以使表中的數(shù)據(jù)唯一;6、索引在加快查詢數(shù)據(jù)速度的同時,因為在數(shù)據(jù)更新時還要更新索引,因而會減慢數(shù)據(jù)更新速度。
(三)關(guān)系系統(tǒng)調(diào)優(yōu)。現(xiàn)在市面上的數(shù)據(jù)庫系統(tǒng)幾乎都是關(guān)系數(shù)據(jù)庫系統(tǒng),由于關(guān)系系統(tǒng)所覆蓋的應(yīng)用領(lǐng)域不同,如果想使關(guān)系系統(tǒng)高效執(zhí)行,就必須具體仔細的分析特定的應(yīng)用。
1、表的設(shè)計及其規(guī)范化。應(yīng)用設(shè)計的開始步驟之一就是表的設(shè)計,表是數(shù)據(jù)存儲的載體,運行以后對表的修改牽涉很多,所以在設(shè)計之初就應(yīng)該做好規(guī)范化工作。
一個關(guān)系模式結(jié)這分解可以得到不同關(guān)系模式集合,也就是說分解方法不是唯一的。最小冗余的要求必須以分解后的數(shù)據(jù)庫能夠表達原來數(shù)據(jù)庫所有信息為前提來實現(xiàn)。其根本目標(biāo)是節(jié)省存儲空間,避免數(shù)據(jù)不一致性,提高對關(guān)系的操作效率,同時滿足應(yīng)用需求。實際上,并不一定要求全部模式都達到BCNF不可。有時故意保留部分冗余可能更方便數(shù)據(jù)查詢。尤其對于那些更新頻度不高,查詢頻度極高的數(shù)據(jù)庫系統(tǒng)更是如此。
規(guī)范化固然重要,但是,雖然非規(guī)范化的關(guān)系存在很多的缺點,但是為了性能,有時卻不得不按照逆規(guī)范化的思想來設(shè)計關(guān)系模式。這主要出現(xiàn)在某些特定的查詢。一般來說,對于經(jīng)常更新的關(guān)系,逆規(guī)范化會降低性能。但是在低更新率的情況下,逆規(guī)范化可能會提高性能。因此,一些應(yīng)用采用逆規(guī)范化方法設(shè)計檔案數(shù)據(jù)的模式,而使用規(guī)范化方法設(shè)計在線數(shù)據(jù)的模式。
2、查詢調(diào)優(yōu)。查詢是數(shù)據(jù)庫使用者進行的主要操作之一。在這方面,最初的調(diào)優(yōu)方法是試用那些沒有壞的影響的方法。大部分的變化,比如增加索引、改變模式或者修改事務(wù)的長度都對全局有影響,有時是有害的負面影響。而重寫查詢使之以更高的速度運行則只有有利的影響。
三、結(jié)語
數(shù)據(jù)庫性能調(diào)優(yōu)是知識密集型的學(xué)科,需要綜合考慮各種復(fù)雜的因素。性能是數(shù)據(jù)庫應(yīng)用的永恒話題,也是衡量一個數(shù)據(jù)庫系統(tǒng)成功與否的重要指標(biāo)。但是,想讓數(shù)據(jù)庫達到最優(yōu)性能從來就不是一件簡單的任務(wù),需要涉及很多方面的知識。如何讓數(shù)據(jù)庫性能更加優(yōu)越,還有待我們在以后的應(yīng)用中不斷完善。