摘要:針對目前關(guān)系數(shù)據(jù)庫查詢中SQL查詢語句存在的問題,本文進(jìn)行了詳細(xì)的分析,并提出數(shù)據(jù)庫SQL查詢語句的優(yōu)化方案。
關(guān)鍵字:關(guān)系數(shù)據(jù)庫 SQL查詢語句 優(yōu)化
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1674-098X(2011)12(a)-0000-00
1 背景
數(shù)據(jù)庫是現(xiàn)代計算機信息系統(tǒng)和計算機應(yīng)用系統(tǒng)的基礎(chǔ)和核心。數(shù)據(jù)庫技術(shù)最初產(chǎn)生于20世紀(jì)60年代中期,隨著計算機管理數(shù)據(jù)的規(guī)模越來越大,應(yīng)用越來越廣泛,數(shù)據(jù)庫技術(shù)
也在不斷的發(fā)展和提高,80年代以來,數(shù)據(jù)庫技術(shù)在商業(yè)領(lǐng)域的巨大成功刺激了其他領(lǐng)域
對數(shù)據(jù)庫技術(shù)需求的迅速增長,這些新的領(lǐng)域為數(shù)據(jù)庫應(yīng)用開辟了新的天地,市場需求直接
推動了數(shù)據(jù)庫技術(shù)的研究和發(fā)展,數(shù)據(jù)庫技術(shù)呈現(xiàn)出網(wǎng)絡(luò)化、智能化、標(biāo)準(zhǔn)化和超大型化的
發(fā)展趨勢。
數(shù)據(jù)庫在網(wǎng)絡(luò)環(huán)境下的應(yīng)用,必定會有數(shù)據(jù)的大量傳輸,這樣給網(wǎng)絡(luò)傳輸帶來了巨大的壓力,某些數(shù)據(jù)操作只能在待定節(jié)點執(zhí)行,此外網(wǎng)絡(luò)環(huán)境本身有高度異構(gòu)性(節(jié)點執(zhí)行的快慢不同,網(wǎng)絡(luò)連接速率不同)等,都給數(shù)據(jù)庫操作帶來了新的問題。用戶提出一個查詢,經(jīng)常會涉及到網(wǎng)絡(luò)中的大量節(jié)點,在這種情況下,如何根據(jù)節(jié)點的通信速率和計算能力選擇合適的節(jié)點,盡量縮短查詢的響應(yīng)時間,提高查詢的速率,是查詢過程中的一個重要問題。而傳統(tǒng)的數(shù)據(jù)庫查詢算法對于這些問題則缺乏考慮。本文主要針對SQL查詢語句進(jìn)行優(yōu)化,通過具體的案例得出科學(xué)的查詢語句盡可能的縮短查詢的響應(yīng)時間,提高服務(wù)器的效率。
2 SQL查詢優(yōu)化概述
數(shù)據(jù)庫技術(shù)研究的主要目標(biāo)是盡可能的滿足用戶的各種需求,使數(shù)據(jù)庫系統(tǒng)的應(yīng)用能面向各個領(lǐng)域。也就是說對使用數(shù)據(jù)庫的查詢用戶來說,只需要對查詢行為進(jìn)行簡單的描述,而無須關(guān)注獲取這些數(shù)據(jù)的內(nèi)部過程。查詢優(yōu)化就是在查詢執(zhí)行引擎生成一個執(zhí)行策略的過程中,盡量使查詢的總資源占用和總時間消耗極小化。在數(shù)據(jù)庫管理系統(tǒng)中,通常內(nèi)置了一個查詢優(yōu)化器作為一個功能模塊,其主要任務(wù)是加快查詢執(zhí)行和數(shù)據(jù)傳輸?shù)倪^程,當(dāng)查詢表達(dá)式經(jīng)過查詢處理器的語法分析子模塊以后,查詢優(yōu)化器為查詢選擇一種適合的數(shù)據(jù)存取策略即查詢處理執(zhí)行方案作為輸出。
3 SQL查詢語句的優(yōu)化原則
合理的使用索引時可以有效的提高查詢速度,性能優(yōu)良合理的SQL語句, 能使建立的索引就發(fā)揮其作用,否則索引將不能優(yōu)化查詢,而且還浪費空間。
(1)在進(jìn)行查詢時,返回的值應(yīng)該是查詢所需要的,保證在實現(xiàn)功能的基礎(chǔ)上,盡量減少對數(shù)據(jù)庫的訪問次數(shù);
(2)通過搜索參數(shù),盡量減少對表的訪問行數(shù),最小化結(jié)果集,從而減輕網(wǎng)絡(luò)負(fù)擔(dān);能夠分開的操作盡量分開處理,提高每次的響應(yīng)速度;
(3)在數(shù)據(jù)窗口使用SQL時,盡量把使用的索引放在選擇的首列;
(4)算法的結(jié)構(gòu)盡量簡單;
(5)在查詢時,不要過多地使用通配符如“select * from test”語句,選擇需要輸出的列。
(6)沒有建索引的情況下,在輸入查詢條件時,所服合條件值范圍小的列寫在前,符合條件值范圍大的列寫在后。
(7)應(yīng)盡量避免在 where 子句中對字段進(jìn)行 1 值判斷,否則將導(dǎo)致查詢放棄使用索引而進(jìn)行全表掃描。
(8)應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將導(dǎo)致查詢放棄使用索引而進(jìn)行全表掃描。優(yōu)化器將無法通過索引來確定將要命中的行數(shù),需要搜索該表的所有行。
(9)應(yīng)盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致查詢放棄使用索引而進(jìn)行全表掃描。
(10)in 和 not in 也要慎用,因為in會使系統(tǒng)無法使用索引,而只能直接搜索表中的數(shù)據(jù)。
4 SQL查詢語句優(yōu)化的驗證
(1)測試SQL查詢優(yōu)化語句的效率
在優(yōu)化查詢語句中選擇幾種進(jìn)行測試并對結(jié)果進(jìn)行分析從而得出正確的結(jié)論。
在沒建立索引的情況下,WHERE子句后面的條件順序?qū)Υ髷?shù)據(jù)量表的查詢會產(chǎn)生直接的影響。
語句一:select id,name from test where xb='男' and jg='湖南長沙'
語句二:select id,name from test where jg='湖南長沙' and xb='男'
以上兩個SQL中xb及jg兩個字段都沒進(jìn)行索引,所以執(zhí)行的時候都是全表掃描,如果xb=’男’條件在記錄集內(nèi)比率為60%,而jg='湖南長沙'的比率只為10%,在進(jìn)行第一條SQL的時候60%條記錄都進(jìn)行性別和籍貫的比較,而在進(jìn)行第二條SQL的時候15%條記錄都進(jìn)行性別和籍貫的比較,以此可以得出第二條SQL的CPU占用時間明顯比第一條低。
5結(jié)論
數(shù)據(jù)庫查詢優(yōu)化是一項綜合性工作,受到各種各樣因素的制約,有些要求往往是彼此矛
盾的。因此設(shè)計者必須根據(jù)實際情況,對各種可實現(xiàn)的SQL語句進(jìn)行優(yōu)化,在基本合理的總體設(shè)計的基礎(chǔ)上,對數(shù)據(jù)庫查詢做一些優(yōu)化調(diào)整,力求最大限度地提高操作效率,減少異常等,滿足用戶各種各樣的要求,實現(xiàn)數(shù)據(jù)庫的查詢優(yōu)化設(shè)計。
對于數(shù)據(jù)庫的優(yōu)化,我們要抓住關(guān)鍵問題,提出改善查詢效率,這樣才能真正使數(shù)據(jù)庫服務(wù)得到根本提高。本文在對數(shù)據(jù)庫查詢優(yōu)化的方法上,進(jìn)行了分析、實驗,并得到了相關(guān)的數(shù)據(jù)予以支持,有效的提高數(shù)據(jù)庫查詢效率。
參考文獻(xiàn)
[1] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論(第三版) [M].北京:高等教育出版社,2002,15-96.
[2] 王立.基于基因算法的大型關(guān)系數(shù)據(jù)庫查詢優(yōu)化技術(shù)研究[D].重慶大學(xué), 2008,13-14.
[3] 周冬平.關(guān)系型數(shù)據(jù)庫查詢優(yōu)化技術(shù)的研究與實現(xiàn)[D].南京航空航天大學(xué), 2003,10-21.
[4] 劉亞新.數(shù)據(jù)庫查詢優(yōu)化技術(shù)于研究及其應(yīng)用[D].大連理工大學(xué), 2006, 15.
[5] 愛軍. 基于數(shù)據(jù)庫查詢過程優(yōu)化設(shè)計[J].電子科技大學(xué)學(xué)報,2003,1-2.