摘要:查詢(xún)優(yōu)化在關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)中有著非常重要的地位,是影響RDBMS性能的關(guān)鍵因素。本文主要?dú)w納總結(jié)實(shí)現(xiàn)查詢(xún)優(yōu)化應(yīng)遵循的一些原則和使用技巧,介紹二重查詢(xún)優(yōu)化教學(xué)模式,以培養(yǎng)學(xué)生編寫(xiě)出高質(zhì)量的SQL語(yǔ)句,提高應(yīng)用系統(tǒng)的性能。
關(guān)鍵詞:數(shù)據(jù)庫(kù);SQL查詢(xún);教學(xué)模式
SQL語(yǔ)言的學(xué)習(xí)是數(shù)據(jù)庫(kù)應(yīng)用技術(shù)課程教學(xué)的重點(diǎn)內(nèi)容,學(xué)生能否靈活熟練掌握SQL語(yǔ)句,編寫(xiě)出高質(zhì)量的SQL句子,是學(xué)好該課程的關(guān)鍵[1],也是開(kāi)發(fā)與數(shù)據(jù)庫(kù)應(yīng)用相關(guān)軟件的基礎(chǔ)。因?yàn)镾QL語(yǔ)句可以有多種不同的寫(xiě)法,所以它易學(xué),但難于精通,是教學(xué)難點(diǎn)內(nèi)容。在此,我們根據(jù)多年教學(xué)工作經(jīng)驗(yàn),在教學(xué)中以實(shí)際數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中數(shù)據(jù)設(shè)計(jì)和數(shù)據(jù)查詢(xún)的使用為例,分析探索查詢(xún)優(yōu)化的方法,采用“數(shù)據(jù)庫(kù)設(shè)計(jì)→設(shè)計(jì)優(yōu)化→編寫(xiě)SQL語(yǔ)句→語(yǔ)句優(yōu)化”的二重優(yōu)化模式方法,教學(xué)效果良好。本文通過(guò)歸納總結(jié)學(xué)習(xí)掌握數(shù)據(jù)設(shè)計(jì)和SQL查詢(xún)優(yōu)化的方法,闡述了SQL優(yōu)化教學(xué)的關(guān)鍵所在。
1二重查詢(xún)優(yōu)化模式
學(xué)生學(xué)習(xí)SQL語(yǔ)言,通常只停留在能查詢(xún)出所要求的結(jié)果,這樣的水平并不深究查詢(xún)效率,更不進(jìn)行查詢(xún)優(yōu)化測(cè)試,其原因在于學(xué)生還沒(méi)有開(kāi)發(fā)過(guò)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),未能體會(huì)到通過(guò)優(yōu)化查詢(xún)提高系統(tǒng)性能的意義;例如:一個(gè)基于B/S(或C/S)模式的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),用戶(hù)對(duì)數(shù)據(jù)庫(kù)連接和響應(yīng)速度很敏感,如果數(shù)據(jù)庫(kù)響應(yīng)速度太慢,不能及時(shí)反饋用戶(hù)要查詢(xún)的數(shù)據(jù),用戶(hù)就會(huì)難以忍受,從而直接影響用戶(hù)對(duì)整個(gè)系統(tǒng)的評(píng)價(jià)。因此,設(shè)計(jì)、編寫(xiě)高效合理的查詢(xún)語(yǔ)句,提高數(shù)據(jù)庫(kù)響應(yīng)速度就顯得非常重要,當(dāng)然,這對(duì)編程和設(shè)計(jì)人員的要求也更高一層。在教學(xué)中,要闡明
優(yōu)化查詢(xún)的重要意義,以實(shí)際應(yīng)用講授查詢(xún)優(yōu)化的方法,激發(fā)學(xué)生的學(xué)習(xí)興趣,使學(xué)生在編寫(xiě)基本SQL語(yǔ)句的基礎(chǔ)上,盡快掌握查詢(xún)優(yōu)化技術(shù)[2]。
1.1查詢(xún)優(yōu)化知識(shí)體系
在大多數(shù)實(shí)際數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中,查詢(xún)操作在各種數(shù)據(jù)庫(kù)操作中所占比重最大,而每個(gè)查詢(xún)操作都會(huì)有許多可供選擇的執(zhí)行策略和操作算法,查詢(xún)優(yōu)化就是選擇一個(gè)高效的執(zhí)行的查詢(xún)處理策略。查詢(xún)優(yōu)化的方法多種多樣,按照優(yōu)化層次可分為代數(shù)優(yōu)化和物理優(yōu)化[3]。代數(shù)優(yōu)化是指關(guān)系代數(shù)表達(dá)式的優(yōu)化,即按照一定的規(guī)則,改變代數(shù)表達(dá)式中操作的次序和組合,使查詢(xún)執(zhí)行更高效;物理優(yōu)化是指存取路徑和底層操作算法的選擇,其選擇依據(jù)可以是基于規(guī)則的,也可以是基于代價(jià)的,還可以是基于語(yǔ)義的。查詢(xún)優(yōu)化的理論基礎(chǔ)知識(shí)體系如圖1所示。
1.2二重查詢(xún)優(yōu)化流程
依據(jù)查詢(xún)優(yōu)化的理論,在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的開(kāi)發(fā)中,為了能夠系統(tǒng)地進(jìn)行查詢(xún)優(yōu)化,我們提出二重查詢(xún)優(yōu)化模式:數(shù)據(jù)庫(kù)設(shè)計(jì)→設(shè)計(jì)優(yōu)化→編寫(xiě)SQL語(yǔ)句→語(yǔ)句優(yōu)化,即設(shè)計(jì)優(yōu)化和語(yǔ)句優(yōu)化,兩次優(yōu)化,先后順序并無(wú)固定,可循環(huán)多次,以達(dá)到最好的優(yōu)化效果。整個(gè)模式操作方便、思路清晰,實(shí)施關(guān)鍵在于第一重優(yōu)化和第二重優(yōu)化的具體方法,文中第2部分、第3部分有詳細(xì)介紹。查詢(xún)優(yōu)化的教學(xué)過(guò)程流程可以進(jìn)一步擴(kuò)展,如圖2所示。
二重查詢(xún)優(yōu)化方法,第一重優(yōu)化,即設(shè)計(jì)優(yōu)化,實(shí)施在數(shù)據(jù)庫(kù)設(shè)計(jì)階段的關(guān)系模式優(yōu)化之后,要通過(guò)修改、調(diào)整、和重構(gòu)模式,經(jīng)過(guò)反復(fù)嘗試和比較,得到最終的優(yōu)化的關(guān)系模式,它是進(jìn)行語(yǔ)句優(yōu)化的基礎(chǔ)。第二重優(yōu)化過(guò)程是應(yīng)用程序設(shè)計(jì)層面,應(yīng)按照系統(tǒng)支持的各種應(yīng)用分別試驗(yàn)它們?cè)跀?shù)據(jù)庫(kù)操作的效率,弄清它們?cè)趯?shí)際運(yùn)行中能否完成預(yù)定的功能。但并不意味著設(shè)計(jì)過(guò)程結(jié)束,就不能再進(jìn)行調(diào)整數(shù)據(jù)庫(kù),在實(shí)際運(yùn)行和維護(hù)過(guò)程中,調(diào)整、修改數(shù)據(jù)庫(kù)及其應(yīng)用的事是常常發(fā)生的,因此,二重查詢(xún)優(yōu)化,在實(shí)施中,并沒(méi)有固定順序,且可反復(fù)進(jìn)行,直至達(dá)到理想效果。
圖2二重查詢(xún)優(yōu)化教學(xué)流程圖
2設(shè)計(jì)優(yōu)化
二重查詢(xún)優(yōu)化模式,首先是通過(guò)數(shù)據(jù)庫(kù)合理設(shè)計(jì)進(jìn)行優(yōu)化,對(duì)應(yīng)于優(yōu)化層次的物理優(yōu)化,選擇合理的存取路徑和底層操作算法。一般遵循以下策略和技巧來(lái)改善查詢(xún)計(jì)劃,提高應(yīng)用系統(tǒng)的性能。
2.1合理的索引設(shè)計(jì)
索引是數(shù)據(jù)庫(kù)設(shè)計(jì)中最重要的數(shù)據(jù)結(jié)構(gòu),利用索引可以快速訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)表中的特定信息,它是對(duì)數(shù)據(jù)庫(kù)表中的一個(gè)或多個(gè)列的值進(jìn)行排序的結(jié)構(gòu),數(shù)據(jù)庫(kù)性能問(wèn)題都可以采用索引技術(shù)得到解決。在設(shè)計(jì)數(shù)據(jù)庫(kù)關(guān)系圖中,可以為選定的表創(chuàng)建、編輯或刪除索引/鍵屬性頁(yè)中的每個(gè)索引類(lèi)型,當(dāng)保存附加在此索引上的表或包含此表數(shù)據(jù)關(guān)系圖時(shí),同時(shí)被保存。
對(duì)索引操作,學(xué)生一般較容易掌握,學(xué)生往往在學(xué)習(xí)使用索引時(shí),不清楚在何種情況下需使用索引,這是因?yàn)閷W(xué)生對(duì)應(yīng)用問(wèn)題理解不夠透徹。所以,教學(xué)中要強(qiáng)調(diào)說(shuō)明,在考慮是否為一個(gè)列創(chuàng)建索引時(shí),應(yīng)考慮被索引的列是否以及如何用于查詢(xún)。
2.1.1索引的作用
建立索引,基本思路是考慮索引對(duì)哪些查詢(xún)有幫助,通常有如下所列的情況。
1) 搜索符合特定搜索關(guān)鍵字值的行(精確匹配查詢(xún));
2) 搜索其搜索關(guān)鍵字值為范圍值的行(范圍查詢(xún));
3) 根據(jù)聯(lián)接謂詞,在一個(gè)表中搜索與另一個(gè)表中的某行匹配的行(索引嵌套循環(huán)連接);
4) 在不進(jìn)行顯式排序操作的情況下產(chǎn)生經(jīng)排序的查詢(xún)輸出,尤其是經(jīng)排序的動(dòng)態(tài)游標(biāo);
5) 在不進(jìn)行顯式排序操作的情況下,按一種有序的順序?qū)π羞M(jìn)行掃描,以允許基于順序的操作,如合并聯(lián)接和流聚合;
6) 以?xún)?yōu)于表掃描的性能對(duì)表中所有的行進(jìn)行掃描,性能提高是由于減少了要掃描的列集和數(shù)據(jù)總量;
7) 搜索插入和更新操作中重復(fù)的新搜索關(guān)鍵字值,以實(shí)施PRIMARY KEY和UNIQUE約束;
8) 搜索已定義了FOREIGN KEY約束的兩個(gè)表之間匹配的行。
2.1.2使用索引要遵循的原則
我們要考慮到索引的使用要恰到好處,指導(dǎo)學(xué)生使用索引要遵循如下原則。
1) 主鍵上建立索引是首選,另外對(duì)連接中頻繁使用的列(包括外鍵)也應(yīng)作為建立索引考慮的選項(xiàng)。不經(jīng)常連接的字段則由優(yōu)化器自動(dòng)生成索引;引導(dǎo)學(xué)生學(xué)會(huì)使用SQL事件探查器和索引優(yōu)化向?qū)椭治霾樵?xún),確定要?jiǎng)?chuàng)建的索引。
2) 覆蓋的查詢(xún)可以提高性能。覆蓋的查詢(xún)是指查詢(xún)中所有指定的列都包含在同一個(gè)索引中。
3) 對(duì)于不需要修改數(shù)據(jù)的查詢(xún)(SELECT語(yǔ)句),大量的索引有助于提高性能。而如果一個(gè)表創(chuàng)建有大量的索引會(huì)影響INSERT、UPDATE和DELETE語(yǔ)句的性能,因?yàn)樵诒碇械臄?shù)據(jù)更改時(shí),所有的索引都須進(jìn)行適當(dāng)?shù)恼{(diào)整。
4) 在頻繁進(jìn)行排序或分組(即進(jìn)行GROUP BY分組或ORDER BY排序)的列上建立索引;在不同值較多的列上建立檢索,而在不同值很少的列上不建立索引。
5) 可以在視圖和計(jì)算列上指定索引,這樣顯得更方便和快捷。
2.1.3對(duì)于索引種類(lèi)使用策略
如果需要排序的列有多個(gè),可以在這些列上建立組合索引。經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值可考慮建立組合索引;可考慮建立聚簇索引的情況有:包含有大量非重復(fù)值的列;使用BETW