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