四、在SQL語句上的查詢優化。
前台的應用程序要在數據庫服務器上起作用,最終靠的都是應用程序中的一條條SQL語句。據不完全統 計,SQL語句消耗了數據庫服務器80%左右的資源。所以,如何提高SQL語句的執行效率,是在數據庫查詢 優化中必須要考慮的一個問題。
但是,在實際工作中,許多程序員有個誤區,他們認為數據庫查詢優化不是他們的事情,而應該是數 據庫管理系統的任務,這是很多程序員的一個錯誤認識。他們錯誤地認為,他們所開發的應用程序的性能 ,跟他們所編寫的SQL語句關系不大。一個好的查詢語句往往可以使得應用程序的性能提高數十倍,而且 ,隨著記錄量的增加,這個效果還會以幾何級數上升。
另外,SQL語句是獨立於程序設計邏輯的,也就是說,無論你的業務邏輯是怎麼設計的,最後分解成 SQL語句,就是那麼幾個語法,所以,相對於應用程序源代碼的優化,SQL查詢語句的優化在時間與風險上 ,都要低許多。
對於SQL語句的優化,Oracle數據庫與SQL Server數據庫有類似的地方,也有一些差異。下面筆者就這 兩者的差異與共同點做一個綜合介紹。
1、 通過索引來提高SQL語句的執行效率。
一般來說,對於一些經常需要查詢的表,如產品信息表,我們可以通過建立外鍵來提高查詢效率。但 是,也不是說每個字段都要指定為外鍵。對於一些沒有指定外鍵的字段,我們可以為其建立索引,來提高 數據表的查詢效率。
一般情況,在以下幾種情況下,我們可以為表建立索引來提高SQL語句的執行效率。
一是對於一些經常需要查詢的表,我們出於某種考慮,沒有設置外鍵,而是通過設置索引來提高對於 表的查詢效率。在數據庫表中,外鍵的設置往往受到一些限制;而相對於外鍵來說,索引的限制則要小得 多。所以,在一些不使用外鍵的情況下,我們可以采用索引來提高對於表的查詢效率。
二是在需要頻繁進行排序或者分組的表上,建立索引,可以極大地提高查詢效率。如ERP系統在設計的 時候,可能需要頻繁地查詢采購訂單明細,而且,這份報表是需要根據采購訂單的號碼進行排序。如此的 話,在數據庫設計的時候,就可以把采購訂單的號碼設置為索引,在每次運行采購訂單明細作業的時候, 前台ERP程序的性能就會高許多。而有時候,可能需要按供應商來統計當天的進貨金額,此時,最好能夠 在進貨明細表中,給供應商字段添加索引,這對於提高當天進貨匯總表作業的運行效率,會有非常大的幫 助。總之,在分組查詢或者排序查詢的表上,設置索引對於提高應用程序的整體性能,具有不可忽視的作 用。
三是如果待排序的列有多個,則需要在這些列上建立復合索引。如前台應用程序在生成當天的進貨明 細表時,需要按供應商、采購訂單號、產品編號進行排序。此時,也就是說,在生成進貨明細表這份報表 時,要按這三個字段進行排序。遇到這種情況時,對這些字段建立復合索引,提高查詢效率,是一個不錯 的選擇。
以上這些SQL語句優化,Oracle數據庫與SQL Server數據庫都可以實現。雖然具體的實現語句可能稍有 區別,但都是換湯不換藥,沒有本質區別。
2、 把索引與數據文件存放在不同的磁盤中。
當索引或者數據庫文件比較龐大時,把他們放在同一個磁盤中會加大輸入輸出等競爭,從而抵消了索 引的作用。為了解決過多的索引導致輸入輸出效率降低的問題,在數據庫設計的時候,最好把索引跟用戶 的表空間建立在不同的磁盤中。如把數據庫的表空間建立在一塊硬盤中,而把索引建立在另外一塊硬盤中 。如此的話,就可以明顯地降低輸入輸出競爭。也就是說,這樣設計,隨著索引的增加,不會導致輸入輸 出效率的低下。
不過,根據筆者的了解,索引與數據文件存放在不同的磁盤中,現在好像只有Oracle 數據庫可以做到 ,而微軟的SQL Server數據庫則無法實現這一點。
這也許根他們的定位不同。甲骨文的數據庫系統是針對大型的數據庫應用而設計,所以,對於查詢的 效率要求更加高。