?磁盤排序,影響Oracle數據庫性能的罪魁禍首 | 鄭州計算機學校_鄭州電腦學校_鄭州電腦培訓

  當建立同Oracle會話時,會在服務器內存中劃分出一個專門用來排序的區域,從而為會話提供排序空間。但是,這個排序空間畢竟有限,若記錄數量超過這個排序空間的話,就需要進行磁盤排序。但是,我們都知道,磁盤排序的執行速度要比內存排序的執行速度慢1400倍。而且,磁盤排序會消耗臨時表空間的資源,并且可能影響到正在進行的其他SQL排序,因為Oracle必須為臨時表空間中的數據塊分配緩沖池。而且,過多的磁盤排序會導致空閑緩沖等待,以及將執行其他任務的數據塊從緩沖池中分頁出去。對于數據庫管理員來說,在內存中進行排序總是比磁盤排序更受歡迎。所以說,磁盤排序是影響Oracle數據庫性能的罪魁禍首。  在數據庫優化的時候,我們應該想法設法降低數據庫的磁盤排序。為此,筆者有如下建議。  一、合理設置Sort_area_size參數。  雖然說Oracle10G以后的數據庫會自動對內存進行管理。但是,在一些性能要求比較高或者排序頻率比較高的數據庫中,仍然有必要對一些影響內存分配的參數進行調整。其中,最重要的一個參數就是Sort_area_size。  Oracle數據庫會為所有的鏈接Oracle會話分配Sort_area_size這個參數。所以,對于擁有大量用戶的數據庫來說,如果增加這個參數的值,會讓磁盤排序的幾率明顯降低,不過數據庫也要為此付出這個代價,很容易導致內存過載。但是,如果這個參數的值設置的過低的話,又會導致過多的磁盤排序。  所以,這個參數并不是越大越好。因為這個參數如果設置的過大的話,其帶來的性能收益反而會降低。因為為了提高有限幾個查詢的速度,可能會浪費大量的內存。這無疑是我們數據庫管理員不希望看到的。  在實際工作中,我們往往需要在兩者之間進行一個均衡。設置一個合理的參數,盡量讓數據庫減少磁盤排序的幾率,同時也不能使得服務器內存過載。  為此筆者有一個建議。數據庫管理員應該每隔一段時間增加這個參數的值,并使用Statspack工具定時監控內存排序與磁盤排序的數據。在起初進行調整的時候最好每個小時查詢一次。通過這些數據,我們就可以得到一個合理的參數值,在兩這之間取得一個均衡。  前期調整完成后,在后期仍然需要進行監控。因為后期隨著企業應用的改變,這個參數仍然需要根據實際情況進行調整,以提高數據庫的性能。  二、盡量減少不必要的排序。  在某些情況下,盡管數據庫管理員沒有直接通過Order By等語句對數據庫記錄進行排序,可是Oracle數據庫服務器仍然會對查詢結果進行排序。因為這些語句需要起作用,必須要先對數據進行排序。所以,他們往往帶有隱性的排序功能。  我們在數據庫維護或者前臺應用程序設計的時候,要盡量的減少這種不必要的排序。如Distinct關鍵字,它的作用就是取消重復的記錄。但是,要實現這個目的的話,則數據庫必須要先對記錄進行排序,然后才能夠去除重復的記錄內容。故在設計的時候,盡量要避免使用Distinct關鍵字。其實,筆者在工作中,經常會碰到這種情況,某些記錄其實不存在重復記錄,但是程序開發人員為了保障數據的準確性,就在SQL語句中加入了Distinct關鍵字,從而造成了不必要的排序。  另外,在其他一些情況下,也會導致不必要的排序。如排序合并連接,也會導致不必要的排序。故無論何時,只要使用了排序合并連接,就會執行排序已連接關鍵值。故在數據庫與應用程序設計的時候,要盡量避免排序合并連接。其實,在許多情況下,嵌套循環連接反而使更好的選擇。因為這個嵌套循環連接,它更加有效而且不會導致不必要的排序以及不比要的全表掃描。  其次,有時候缺失索引也會導致一些并不要的排序。  故數據庫管理員在平時的工作中,要盡量的減少這些不必要的排序,以讓寶貴的內存資源交給更重要的任務來適用。  三、利用Statspack工具監控排序活動。  Statspack工具是一款提高Oracle數據庫性能的很好的輔助工具。因為它可以幫助我們收集很多有用的信息。故我們數據庫管理員也可以利用Statspack工具對數據庫中的排序活動進行監控。

6十1开奖黑龙江