磁盤排序?qū)racle數(shù)據(jù)庫性能的影響
當(dāng)建立同Oracle會(huì)話時(shí),會(huì)在服務(wù)器內(nèi)存中劃分出一個(gè)專門用來排序的區(qū)域,從而為會(huì)話提供排序空間。但是,這個(gè)排序空間畢竟有限,若記錄數(shù)量超過這個(gè)排序空間的話,就需要進(jìn)行磁盤排序。但是,我們都知道,磁盤排序的執(zhí)行速度要比內(nèi)存排序的執(zhí)行速度慢1400倍。而且,磁盤排序會(huì)消耗臨時(shí)表空間的資源,并且可能影響到正在進(jìn)行的其他SQL排序,因?yàn)镺racle必須為臨時(shí)表空間中的數(shù)據(jù)塊分配緩沖池。而且,過多的磁盤排序會(huì)導(dǎo)致空閑緩沖等待,以及將執(zhí)行其他任務(wù)的數(shù)據(jù)塊從緩沖池中分頁出去。對(duì)于數(shù)據(jù)庫管理員來說,在內(nèi)存中進(jìn)行排序總是比磁盤排序更受歡迎。所以說,磁盤排序是影響Oracle數(shù)據(jù)庫性能的罪魁禍?zhǔn)?。在?shù)據(jù)庫優(yōu)化的時(shí)候,我們應(yīng)該想法設(shè)法降低數(shù)據(jù)庫的磁盤排序。為此,筆者有如下建議。
一、合理設(shè)置Sort_area_size參數(shù)
雖然說Oracle10G以后的數(shù)據(jù)庫會(huì)自動(dòng)對(duì)內(nèi)存進(jìn)行管理。但是,在一些性能要求比較高或者排序頻率比較高的數(shù)據(jù)庫中,仍然有必要對(duì)一些影響內(nèi)存分配的參數(shù)進(jìn)行調(diào)整。其中,最重要的一個(gè)參數(shù)就是Sort_area_size。
Oracle數(shù)據(jù)庫會(huì)為所有的鏈接Oracle會(huì)話分配Sort_area_size這個(gè)參數(shù)。所以,對(duì)于擁有大量用戶的數(shù)據(jù)庫來說,如果增加這個(gè)參數(shù)的值,會(huì)讓磁盤排序的幾率明顯降低,不過數(shù)據(jù)庫也要為此付出這個(gè)代價(jià),很容易導(dǎo)致內(nèi)存過載。但是,如果這個(gè)參數(shù)的值設(shè)置的過低的話,又會(huì)導(dǎo)致過多的磁盤排序。所以,這個(gè)參數(shù)并不是越大越好。因?yàn)檫@個(gè)參數(shù)如果設(shè)置的過大的話,其帶來的性能收益反而會(huì)降低。因?yàn)闉榱颂岣哂邢迬讉€(gè)查詢的速度,可能會(huì)浪費(fèi)大量的內(nèi)存。這無疑是我們數(shù)據(jù)庫管理員不希望看到的。
在實(shí)際工作中,我們往往需要在兩者之間進(jìn)行一個(gè)均衡。設(shè)置一個(gè)合理的參數(shù),盡量讓數(shù)據(jù)庫減少磁盤排序的幾率,同時(shí)也不能使得服務(wù)器內(nèi)存過載。為此筆者有一個(gè)建議。數(shù)據(jù)庫管理員應(yīng)該每隔一段時(shí)間增加這個(gè)參數(shù)的值,并使用Statspack工具定時(shí)監(jiān)控內(nèi)存排序與磁盤排序的數(shù)據(jù)。在起初進(jìn)行調(diào)整的時(shí)候***每個(gè)小時(shí)查詢一次。通過這些數(shù)據(jù),我們就可以得到一個(gè)合理的參數(shù)值,在兩這之間取得一個(gè)均衡。
前期調(diào)整完成后,在后期仍然需要進(jìn)行監(jiān)控。因?yàn)楹笃陔S著企業(yè)應(yīng)用的改變,這個(gè)參數(shù)仍然需要根據(jù)實(shí)際情況進(jìn)行調(diào)整,以提高數(shù)據(jù)庫的性能
二、盡量減少不必要的磁盤排序
在某些情況下,盡管數(shù)據(jù)庫管理員沒有直接通過Order By等語句對(duì)數(shù)據(jù)庫記錄進(jìn)行排序,可是Oracle數(shù)據(jù)庫服務(wù)器仍然會(huì)對(duì)查詢結(jié)果進(jìn)行排序。因?yàn)檫@些語句需要起作用,必須要先對(duì)數(shù)據(jù)進(jìn)行排序。所以,他們往往帶有隱性的排序功能。
我們?cè)跀?shù)據(jù)庫維護(hù)或者前臺(tái)應(yīng)用程序設(shè)計(jì)的時(shí)候,要盡量的減少這種不必要的排序。如Distinct關(guān)鍵字,它的作用就是取消重復(fù)的記錄。但是,要實(shí)現(xiàn)這個(gè)目的的話,則數(shù)據(jù)庫必須要先對(duì)記錄進(jìn)行排序,然后才能夠去除重復(fù)的記錄內(nèi)容。故在設(shè)計(jì)的時(shí)候,盡量要避免使用Distinct關(guān)鍵字。其實(shí),筆者在工作中,經(jīng)常會(huì)碰到這種情況,某些記錄其實(shí)不存在重復(fù)記錄,但是程序開發(fā)人員為了保障數(shù)據(jù)的準(zhǔn)確性,就在SQL語句中加入了Distinct關(guān)鍵字,從而造成了不必要的排序。
另外,在其他一些情況下,也會(huì)導(dǎo)致不必要的排序。如排序合并連接,也會(huì)導(dǎo)致不必要的排序。故無論何時(shí),只要使用了排序合并連接,就會(huì)執(zhí)行排序已連接關(guān)鍵值。故在數(shù)據(jù)庫與應(yīng)用程序設(shè)計(jì)的時(shí)候,要盡量避免排序合并連接。其實(shí),在許多情況下,嵌套循環(huán)連接反而使更好的選擇。因?yàn)檫@個(gè)嵌套循環(huán)連接,它更加有效而且不會(huì)導(dǎo)致不必要的排序以及不比要的全表掃描。
其次,有時(shí)候缺失索引也會(huì)導(dǎo)致一些并不要的排序。故數(shù)據(jù)庫管理員在平時(shí)的工作中,要盡量的減少這些不必要的排序,以讓寶貴的內(nèi)存資源交給更重要的任務(wù)來適用,提高Oracle數(shù)據(jù)庫性能。
#p#三、利用Statspack工具監(jiān)控排序活動(dòng)
Statspack工具是一款提高Oracle數(shù)據(jù)庫性能的很好的輔助工具。因?yàn)樗梢詭椭覀兪占芏嘤杏玫男畔?。故我們?shù)據(jù)庫管理員也可以利Statspack工具對(duì)數(shù)據(jù)庫中的排序活動(dòng)進(jìn)行監(jiān)控。
對(duì)于一個(gè)有經(jīng)驗(yàn)的數(shù)據(jù)庫管理員來說,對(duì)內(nèi)存排序和磁盤排序保持必要的排需是非常必要的。因?yàn)槲覀儫o法左右用戶的行為;而用戶的行為又會(huì)有所調(diào)整。用戶在調(diào)整的過程中,有可能又會(huì)增加額外的磁盤排序。當(dāng)然,也有可能磁盤排序的幾率會(huì)減少。但是,通常情況下,隨著用戶交易數(shù)據(jù)的增加,這個(gè)磁盤排序的幾率在理論上仍然是往上爬的。而實(shí)際上也是往上升的,只是這個(gè)升的速度沒有理論上那么快而已。這主要是看數(shù)據(jù)庫管理員如何進(jìn)行管理了。
根據(jù)筆者的了解,企業(yè)用戶的操作往往會(huì)有一個(gè)周期性的變化,如按年或者按月進(jìn)行周期性的變化。數(shù)據(jù)庫管理員應(yīng)該養(yǎng)成一個(gè)好習(xí)慣,每個(gè)月利用Statspack工具定期的對(duì)數(shù)據(jù)庫進(jìn)行監(jiān)控。特別是要監(jiān)控?cái)?shù)據(jù)庫的排序情況。Statspack工具還有額外的一個(gè)功能,就是自動(dòng)監(jiān)測(cè)與警告功能。也就是說,可以讓Statspack這個(gè)工具在磁盤排序數(shù)量超過一個(gè)預(yù)設(shè)置的閥值時(shí),自動(dòng)給數(shù)據(jù)庫管理員發(fā)送一個(gè)警告,如通過郵件形式發(fā)送給管理員等等。筆者通過監(jiān)控發(fā)現(xiàn),每到月底與月初的時(shí)候,磁盤排序的數(shù)量會(huì)大大的增加。這主要是因?yàn)樵谠碌椎臅r(shí)候,用戶會(huì)對(duì)當(dāng)月的交易數(shù)據(jù)進(jìn)行統(tǒng)計(jì)。所以當(dāng)月底月初的時(shí)候,由于交易記錄比較多,所以,會(huì)有比較多的磁盤排序發(fā)生。在這種情況下,數(shù)據(jù)庫管理員有必要對(duì)相關(guān)參數(shù)進(jìn)行調(diào)整。不過這個(gè)調(diào)整是暫時(shí)的調(diào)整,等到這個(gè)周期過去后,仍然要把參數(shù)調(diào)回來。只有如此,數(shù)據(jù)庫的整體性能才會(huì)有所保障。即不會(huì)因?yàn)閮?nèi)存過載而降低數(shù)據(jù)庫性能;也不會(huì)因?yàn)榇疟P排序而給數(shù)據(jù)庫造成額外的負(fù)擔(dān)。
所以,雖然排序是SQL語句執(zhí)行中 很微小的一個(gè)部分,但是其對(duì)數(shù)據(jù)庫性能影響卻比較大,而且也是非常顯著的。可惜的是,排序是SQL調(diào)整中往往被忽視的地方。在Oracle數(shù)據(jù)庫中,排序?qū)τ脩魜碚f是透明的。也就是說,排序?qū)τ脩艉苌儆兴拗?,用戶可以根?jù)自己的需要來對(duì)數(shù)據(jù)進(jìn)行隨意地排序。但是,用戶并不知道,什么樣的操作會(huì)降低數(shù)據(jù)庫的性能。故如何降低用戶的不合理操作而產(chǎn)生額外的排序,甚至是磁盤排序,這是數(shù)據(jù)庫管理員在平時(shí)工作中必須要考慮到的一個(gè)問題。通過以上三個(gè)方法,或許可以給數(shù)據(jù)庫管理員找到一些解決問題的思路。相信通過以上方法,可以***程度的減少磁盤排序的發(fā)生,不再讓磁盤排序成為影響數(shù)據(jù)庫性能的罪魁禍?zhǔn)住?/P>
【編輯推薦】






