毛志東 沈洋
【摘 要】本文就大型數(shù)據(jù)庫中常用的SQL語言進(jìn)行性能上的分析,并從數(shù)據(jù)結(jié)構(gòu)上給出其關(guān)鍵數(shù)據(jù)結(jié)構(gòu)和關(guān)鍵算法上效率上的分析,從INSERT,DELETE,SELECT,UPDATE結(jié)合索引給出一般大型數(shù)據(jù)庫的優(yōu)化方法,并系統(tǒng)性的給出提高效率的具體方法。
在當(dāng)前計(jì)算機(jī)應(yīng)用系統(tǒng)中,大型數(shù)據(jù)庫是信息系統(tǒng)的關(guān)鍵環(huán)節(jié),是存儲(chǔ)數(shù)據(jù)的必要手段,互聯(lián)網(wǎng)上大多數(shù)應(yīng)用數(shù)據(jù)存儲(chǔ)在大型數(shù)據(jù)庫中,因此,合理的掌握大型數(shù)據(jù)庫的編程,是信息系統(tǒng)編程至關(guān)重要的環(huán)節(jié)。但是大型數(shù)據(jù)庫的SQL語言使用,和一般的編程環(huán)節(jié)有較大的不同,這使得初級編程人員很難在短期內(nèi)精通,并且難以編制高質(zhì)量的代碼[1]。
SQL語言編程與一般的語言編程有很大不同,SQL語言是過程式語言,強(qiáng)調(diào)對數(shù)據(jù)的操作,但是操作的方式與一般的數(shù)據(jù)操作相比又有很大不同,SQL語言是以數(shù)據(jù)庫中的數(shù)據(jù)塊為數(shù)據(jù)操作單位,因此,對于數(shù)據(jù)庫來說,成批處理數(shù)據(jù),比單獨(dú)一條條處理數(shù)據(jù)有更高的效率,這就決定了SQL語言最好是以數(shù)據(jù)塊的方式進(jìn)行編程,而非逐條記錄的方式處理數(shù)據(jù)的方式處理數(shù)據(jù)。此外,SQL語言是對數(shù)據(jù)塊進(jìn)行操作,需要大量的磁盤I/O操作,因此效率是SQL需要注意的關(guān)鍵問題,設(shè)計(jì)不佳的SQL語言,使得效率極為低下,不能滿足信息系統(tǒng)的需要。
以下我們逐一分析SQL最常用的四種操作數(shù)據(jù)的方法SELECT,UPDATE,DELETE,INSERT的性能。
1.SELECT語句的效率受索引影響,索引對SELECT語句的效率起到了至關(guān)緊要重要的作用,在沒有索引的情況下,SELECT語句使用全表掃描,也就是說,對于需要查找的記錄,在全表范圍內(nèi)進(jìn)行查找,因此,查詢一條記錄和查詢所有記錄的代價(jià)是相當(dāng)?shù)?。在有索引時(shí),SELECT語句的執(zhí)行效率取決于WHERE條件與索引的配置,當(dāng)WHERE條件中的搜索字段定義了索引時(shí),SELECT語句可以利用索引進(jìn)行記錄定位,從而可以快速定位到相應(yīng)記錄。當(dāng)SELECT語句中的條件和索引無關(guān)時(shí),這時(shí)SELECT語句不能利用索引定位,因?yàn)槿匀恍枰頀呙琛?/p>
2.UPDATE語句的效率和SELECT語句的性質(zhì)相似,因此,UPDATE語句在執(zhí)行大批量修改時(shí),效率相當(dāng)高,在對單條記錄進(jìn)行修改時(shí),如果WHERE條件上沒有索引,仍需要進(jìn)行全表掃描,效率較低,但有索引時(shí),會(huì)使用索引進(jìn)行記錄定位,UPDATE語句和SELECT語句的差別在于,UPDATE語句對字段進(jìn)行修改,如果修改的字段上定義了索引時(shí),UPDATE語句需要同時(shí)修改索引。
3.DELETE語句的效率和UPDATE語句極為相似,因此這二類語句同時(shí)可能涉及對索引的修改,執(zhí)行的效率同樣取決于WHERE條件上是否有相應(yīng)的索引結(jié)構(gòu)。
4.INSERT語句的效率在所有方法中是最高的,INSERT語句的插入方法取決于表的性質(zhì),當(dāng)表是堆表時(shí),INSERT語句總是將新記錄插到最后面,因此不需要考慮其它代價(jià),當(dāng)數(shù)據(jù)表上定義了聚簇索引時(shí),由于表中的記錄會(huì)按聚簇索引的次序進(jìn)行排列,因此插入時(shí),會(huì)插入到表中的特定位置,當(dāng)特定位置沒有空間時(shí),會(huì)將數(shù)據(jù)塊分裂,從而保證記錄在數(shù)據(jù)塊上的有序性。
考慮到索引在大型數(shù)據(jù)庫中的重要性,我們對索引進(jìn)行分析,一般來說,索引可分為聚簇索引和非聚簇索引,聚簇索引的特點(diǎn)在于數(shù)據(jù)按索引的在數(shù)據(jù)塊中物理順序排放,非聚簇索引則沒有此要求。一般來說,索引的結(jié)構(gòu)是B+樹,B+樹由于其高效的動(dòng)態(tài)查找性能,在數(shù)據(jù)庫中應(yīng)用廣泛。
B+樹的特點(diǎn)在于矮而粗,B+樹由于矮小,因?yàn)椴檎业膶哟紊伲阅軐?shí)現(xiàn)極高的動(dòng)態(tài)查找效率,但是B+樹同樣需要大量的存貯空間,此外B樹只對選擇性高的字段有效,選擇性差的字段無效。
所謂索引字段的選擇性,是指能否根據(jù)選定的值,快速定位到相應(yīng)的字段,而選擇性高的字段可以優(yōu)先作為索引,選擇性差的字段,不宜作為索引,例如,對于班級表而言,學(xué)號是選擇性高的字段,可以根據(jù)特定的值找到相應(yīng)的記錄,但對于選擇性差的字段,例如性別,當(dāng)使用B+數(shù)對性別建立索引時(shí),最多只能將記錄分為二個(gè)分支“男”“女”,因此無法利用B樹精確定位記錄,因此,建立B樹只能浪費(fèi)空間,并不能提高效率。
此外,如果數(shù)據(jù)庫中的索引建立不準(zhǔn)確,SQL優(yōu)化器可能不會(huì)使用定義的索引進(jìn)行查找,因此索引必須有高選擇性,而且經(jīng)常被用于查找[4]。
SQL語句中,除了SELECT,INSERT,DELETE,UPDATE之外,關(guān)聯(lián)運(yùn)算也是極為重要的操作,數(shù)據(jù)庫中的關(guān)聯(lián)運(yùn)算,如果完全按語義上執(zhí)行,操作極為耗時(shí),因此一般SQL使用優(yōu)化器對之進(jìn)行優(yōu)化處理,對于關(guān)聯(lián)語句關(guān)聯(lián)的A,B表,如果B表在連接字段上定義了索引,那么,就可以先讀取沒有定義索引的A表,然后在A表的每個(gè)記錄上,用索引去查找B表,從而得到關(guān)聯(lián)結(jié)構(gòu)。
因此,索引在關(guān)聯(lián)運(yùn)算中極為重要,是提高效率的有效手段,當(dāng)二張表上沒有定義索引時(shí),SQL優(yōu)化器往往會(huì)在某張表上建立臨時(shí)索引,然后利用臨時(shí)索引進(jìn)行關(guān)聯(lián)查找。
關(guān)聯(lián)運(yùn)算還和內(nèi)存有關(guān),如果緩沖內(nèi)存夠,那么,關(guān)聯(lián)運(yùn)算可以將表放在內(nèi)存中進(jìn)行關(guān)聯(lián),這顯然大大增加了效率,而在內(nèi)存很少時(shí),只能逐一對表進(jìn)行讀取,并進(jìn)行關(guān)聯(lián),效率明顯下降。
此外,應(yīng)用程序的合理編寫,對SQL影響較大,而臨時(shí)表技術(shù),可以大幅提高程序效率,對于需要處理的數(shù)據(jù),我們不直接在表上進(jìn)行操作,而是將需要處理的數(shù)據(jù),從大表中提取出來,放在臨時(shí)表中,因?yàn)榕R時(shí)表中數(shù)據(jù)量較小,因此處理很快,這樣避免了從大表中查找數(shù)據(jù)。
對于信息系統(tǒng),在業(yè)務(wù)處理中,需要區(qū)分二類數(shù)據(jù)處理,一類是短事務(wù)處理,對于前臺(tái)進(jìn)行的操作,是短事務(wù),需要盡快處理,因?yàn)樾枰芨叩男剩鴮τ跀?shù)據(jù)加工如記帳來說,是長事務(wù),需要長時(shí)間的運(yùn)行,在信息系統(tǒng)中,需要處理好二類不同的事務(wù),才可能開發(fā)出良好的數(shù)據(jù)庫應(yīng)用程序。
參考文獻(xiàn):
[1]張水平.數(shù)據(jù)庫原理及SQL Server應(yīng)用[M].西安:西安交通大學(xué)出版社,2008.
[2]Abraham Silberschatz,Henry F.Korth,S.Sudarshan數(shù)據(jù)庫系統(tǒng)概念(第3版)[M].北京:機(jī)械工業(yè)出版社,2008.
[3]Ramez Elmasri,(美)Shamkant B.Navathe.數(shù)據(jù)庫系統(tǒng)基礎(chǔ).高級篇[M].北京:人民郵電出版社,2008.
[4]周輝君.數(shù)據(jù)庫系統(tǒng)優(yōu)化方法研究[J].科技信息,2008(17):70.