摘要:論文論述了SQL優(yōu)化的方法,通過一些簡(jiǎn)單的 SQL 優(yōu)化規(guī)則就可以不同程度地提升 SQL 語句的效率。
關(guān)鍵詞:SQL;效率
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)10-2275-03
Oracle提供了兩種方式訪問全表:
1)全表掃描
全表掃描就是順序遍歷全表,Oracle采用一次讀入多個(gè)數(shù)據(jù)塊(database t_b)的方式對(duì)全表掃描做了優(yōu)化,但是全表掃描的效率是比較低的。
2)通過row_id來訪問
row_id包含了記錄的物理地址信息,采用基于row_id的方式來訪問表可以提高效率。而索引就是oracle聯(lián)系數(shù)據(jù)和存放數(shù)據(jù)的物理地址的紐帶,通常,索引提供了快速訪問row_id的方法,所以基于索引列的查詢就能實(shí)現(xiàn)效率的提升,通常大型表的索引對(duì)效率的提升作用特別明顯。
索引的使用也要得當(dāng),不恰當(dāng)?shù)乃饕炊卤豆Π?,通常需要注意的是以下幾點(diǎn):
1)在經(jīng)常進(jìn)行連接的列上建立索引。
2)在經(jīng)常進(jìn)行g(shù)roup by或者order by操作的列上建立索引。
3)在where語句部分常用到的,并且有較多不同值的列建索引,不要在取值少的列建索引。
5)要避免在索引列上使用IS NULL和IS NOT NULL。對(duì)唯一索引,如索引列包含空值,那么索引中將不存在此記錄;對(duì)復(fù)合索引,如果每個(gè)列均為空,索引中同樣不存在此記錄(如果索引列有一個(gè)不為空,則記錄存在于索引中)。所以要避免在索引中使用可以為空的列,因?yàn)镺RACLE將無法使用該索引??梢詫⑺饕袨榭盏挠涗涍M(jìn)行賦值,或者直接指定索引列為NOT NULL。
2 注意FROM子句的順序
ORACLE采用從右到左的順序來處理FROM子句中的表,寫在最后的表會(huì)被最先處理。在需要從多張表查詢數(shù)據(jù)的時(shí)候,按記錄數(shù)多少降序列出各張表將獲得最高效率。ORACLE在處理多張表時(shí),用排序和合并的方式連接數(shù)據(jù):先掃描第一張表,也就是FROM子句最后的那張表,并對(duì)數(shù)據(jù)進(jìn)行排序,接著掃描第二張表,也就是FROM子句的倒數(shù)第二張表,然后將從第二張表取出的數(shù)據(jù)和第一張表取出的數(shù)據(jù)進(jìn)行合并,依此類推。
3 注意WHERE子句的順序
ORACLE使用自下而上的順序來解析WHERE子句,所以,能過濾最多紀(jì)錄的條件要寫在WHERE子句的最后,幾個(gè)表之間的連接則寫在最前。
4 發(fā)生數(shù)據(jù)變化的時(shí)候,要使用COMMIT
編寫程序和存儲(chǔ)過程的時(shí)候,只要發(fā)生數(shù)據(jù)變化,就要記得寫上COMMIT,這樣程序和存儲(chǔ)過程的性能會(huì)得到提升,隨著COMMIT釋放資源,需求也會(huì)隨之減少。
5 精簡(jiǎn)查詢的次數(shù)
12 避免對(duì)搜索參數(shù)使用其他數(shù)學(xué)操作符
WHERE條件左邊不使用數(shù)學(xué)操作符,可以略微提高執(zhí)行速度。
由于系統(tǒng)在繁忙的應(yīng)用中,服務(wù)器的CPU的使用率在不斷變化中,同一SQL語句,兩次執(zhí)行的時(shí)間就可能不同,上述SQL優(yōu)化的例子中的執(zhí)行時(shí)間是我2次執(zhí)行的平均時(shí)間,所以能反映出不同語句的效率差異。
上述優(yōu)化規(guī)則有的能提高效率上千倍,有的只能提高效率百分之幾,但是對(duì)多終端的系統(tǒng)而言,應(yīng)用程序和復(fù)雜的存儲(chǔ)過程如果都能應(yīng)用以上規(guī)則,就可以提升整個(gè)系統(tǒng)的性能,從而能高效處理各項(xiàng)事務(wù)。
參考文獻(xiàn):
[1] 崔群法. SQL Server 2008中文版從入門到精通[M].北京:電子工業(yè)出版社,2009.
[2] 馬軍,李玉林. SQL語言與數(shù)據(jù)庫操作技術(shù)大全:基于SQL server實(shí)現(xiàn)[M].北京:電子工業(yè)出版社,2008.