在應用項目的實施過程中,筆者發現很多程序員在使用壹些前端數據庫開發工具(如PowerBuilder、Delphi)開發數據庫應用時,只註重華麗的用戶界面,而忽略了查詢語句的效率,導致開發的應用系統效率低下,資源浪費嚴重。因此,如何設計高效合理的查詢語句非常重要。結合應用實例和數據庫理論,介紹了查詢優化技術在實際系統中的應用。
分析問題
很多程序員認為查詢優化是DBMS(數據庫管理系統)的任務,和程序員寫的SQL語句關系不大,這是錯誤的。壹個好的查詢計劃往往可以將程序的性能提高幾十倍。查詢計劃是用戶提交的SQL語句集合,查詢計劃是優化後生成的語句集合。DBMS處理查詢計劃的過程如下:對查詢語句進行詞法和語法檢查後,將語句提交給DBMS的查詢優化器。優化器完成代數優化和訪問路徑優化後,預編譯模塊對語句進行處理並生成查詢計劃,然後在適當的時候提交給系統進行處理和執行,最後將執行結果返回給用戶。實際數據庫產品(如Oracle和Sybase)的高版本采用基於成本的優化方法。這種優化可以根據從系統字典表中獲得的信息來估計不同查詢計劃的成本,然後選擇更好的計劃。雖然數據庫產品在查詢優化方面越來越好,但是用戶提交的SQL語句才是系統優化的基礎。很難想象壹個糟糕的查詢計劃經過系統優化後會變得高效,所以用戶寫的語句質量很重要。系統做出的查詢優化我們暫且不討論,下面重點討論完善用戶查詢計劃的解決方案。
解決問題
以關系數據庫系統Informix為例,介紹了改進用戶查詢計劃的方法。
1.索引的合理使用
索引是數據庫中壹種重要的數據結構,其根本目的是提高查詢效率。目前,大多數數據庫產品采用由IBM首先提出的ISAM索引結構。指標的使用要恰到好處,其使用原則如下:
●索引建立在頻繁連接但未指定為外鍵的列上,對於不頻繁連接的字段,索引由優化器自動生成。
●對經常排序或分組的列建立索引(即按group或order by操作)。
●在條件表達式中經常使用的具有更多不同值的列上建立搜索,而不在具有較少不同值的列上建立索引。例如,employee表的“性別”列中只有“男性”和“女性”兩個不同的值,因此不需要建立索引。如果建立了索引,不但不會提高查詢效率,反而會嚴重拖慢更新速度。
如果有多個要排序的列,可以在這些列上建立復合索引。
●使用系統工具。例如,Informix數據庫有壹個tbcheck工具,可以檢查可疑的索引。在某些數據庫服務器上,由於頻繁的操作,索引可能無效或者讀取效率降低。如果使用索引的查詢莫名其妙地變慢,可以嘗試用tbcheck工具檢查索引的完整性,必要時修復。另外,當數據庫表更新大量數據時,刪除並重建索引可以提高查詢速度。
2.避免或簡化排序
應該簡化或避免對大表的重復排序。當可以通過使用索引以適當的順序自動生成輸出時,優化器會避免排序步驟。以下是壹些影響因素:●要排序的壹個或幾個列沒有包含在索引中;