應用程序的執行其目的就是對數據庫的操作,SQL語句消耗了70%到90%的數據庫資源。因此Oracle數據庫的性能取決於SQL語句的 執行效率。許多程序員認為查詢優化是DBMS(數據庫管理系統)的任務,與程序員所編寫的SQL語句關系不大,這是錯誤的。一個好的查詢計劃往往可以使程序性能提高數十倍。另外,SQL語句獨立於程序設計邏輯,相對於對程序源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低。
SQL優化的主要途徑是:
a.有效索引的建立。在經常進行連接,但是沒有指定為外鍵的列上建立索引;在頻繁進行排序或分組(即進行group by 或 order by 操作)的列上建立索引;在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引;如果待排序的列有多個,可以在這些列上建立復合索引(compound index)。
為了降低I/O竟爭, 索引要建在與用戶表空間不在同一磁盤上的索引空間裡。索引分為:分區索引、完全索引、唯一索引、位圖索引等幾種類型,在建立索引前,應該測量這個索引的選擇性,索引的選擇性是指索引列裡不同值的數目與表中記錄數的比。
b.在有大量重復值並且經常有范圍查詢(例如 between,>,<>=,<=)的列,或是用到order by、group by的列,可考慮建立群集索引 ;
c.要經常同時存取多列,目每列都含有重復值可考慮建立組合索引
d.優化表達式,在能使用范圍查詢時盡可能使用范圍索引, 而少用“like”,因為“LIKE”關鍵字支持的通配符匹配特別耗費時間。
f.使用Oracle語句優化器(Oracle optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。