對(duì)Oracle 數(shù)據(jù)庫(kù)的競(jìng)爭(zhēng)調(diào)整
本文主要講述的是如何調(diào)整 Oracle 數(shù)據(jù)庫(kù)的競(jìng)爭(zhēng) ,我們大家都知道Oracle 的其中一個(gè)***的優(yōu)點(diǎn)就是它可以管理每個(gè)相關(guān)表空間中的一些自由空間。 Oracle 負(fù)責(zé)處理表和索引的空間管理,這樣就可以讓我們無(wú)需懂得 Oracle 的表和索引的內(nèi)部運(yùn)作。
不過(guò),對(duì)于有經(jīng)驗(yàn)的 Oracle 調(diào)優(yōu)專家來(lái)說(shuō),他需要懂得 Oracle 是如何管理表的 extent 和空閑的數(shù)據(jù)塊。對(duì)于調(diào)整擁有高的 insert 或者 update 的系統(tǒng)來(lái)說(shuō),這是非常重要的。
要精通對(duì)象的調(diào)整,你需要懂得 freelists 和 freelist 組的行為,它們和 pctfree 及 pctused 參數(shù)的值有關(guān)。這些知識(shí)對(duì)于企業(yè)資源計(jì)劃( ERP )的應(yīng)用是特別重要的,因?yàn)樵谶@些應(yīng)用中,不正確的表設(shè)置通常是 DML 語(yǔ)句執(zhí)行慢的原因。
對(duì)于初學(xué)者來(lái)說(shuō),最常見(jiàn)的錯(cuò)誤是認(rèn)為默認(rèn)的 Oracle 數(shù)據(jù)庫(kù)參數(shù)對(duì)于所有的對(duì)象都是***的。除非磁盤(pán)的消耗不是一個(gè)問(wèn)題,否則在設(shè)置表的 pctfree 和 pctused 參數(shù)時(shí),就必須考慮平均的行長(zhǎng)和數(shù)據(jù)庫(kù)的塊大小,這樣空的塊才會(huì)被有效地放到 freelists 中。當(dāng)這些設(shè)置不正確時(shí),那些得到的 freelists 也是 "dead" 塊,因?yàn)樗鼈儧](méi)有足夠的空間來(lái)存儲(chǔ)一行,這樣將會(huì)導(dǎo)致明顯的處理延遲。
Freelists 對(duì)于有效地重新使用 Oracle 表空間中的空間是很重要的,它和 pctfree 及 pctused 這兩個(gè)存儲(chǔ)參數(shù)的設(shè)置直接相關(guān)。通過(guò)將 pctused 設(shè)置為一個(gè)高的值,這時(shí)數(shù)據(jù)庫(kù)就會(huì)盡快地重新使用塊。不過(guò),高性能和有效地重新使用表的塊是對(duì)立的。
在調(diào)整 Oracle 的表格和索引時(shí),需要認(rèn)真考慮究竟需要高性能還是有效的空間重用,并且據(jù)此來(lái)設(shè)置表的參數(shù)。以下我們來(lái)看一下這些 freelists 是如何影響 Oracle 的性能的。
當(dāng)有一個(gè)請(qǐng)求需要插入一行到表格中時(shí), Oracle 數(shù)據(jù)庫(kù)就會(huì)到 freelist 中尋找一個(gè)有足夠的空間來(lái)容納一行的塊。你也許知道, freelist 串是放在表格或者索引的***個(gè)塊中,這個(gè)塊也被稱為段頭( segment header )。 pctfree 和 pctused 參數(shù)的唯一目的就是為了控制塊如何在 freelists 中進(jìn)出。
雖然 freelist link 和 unlink 是簡(jiǎn)單的 Oracle 功能,不過(guò)設(shè)置 freelist link (pctused) 和 unlink (pctfree) 對(duì) Oracle 的性能確實(shí)有影響。
由 DBA 的基本知識(shí)知道, pctfree 參數(shù)是控制 freelist un-links 的(即將塊由 freelists 中移除)。設(shè)置 pctfree=10 意味著每個(gè)塊都保留 10% 的空間用作行擴(kuò)展。 pctused 參數(shù)是控制 freelist re-links 的。設(shè)置 pctused=40 意味著只有在塊的使用低于 40% 時(shí)才會(huì)回到表格的 freelists 中。
許多新手對(duì)于一個(gè)塊重新回到 freelists 后的處理都有些誤解。其實(shí),一旦由于一個(gè)刪除的操作而令塊被重新加入到 freelist 中,它將會(huì)一直保留在 freelist 中即使空間的使用超過(guò)了 60% ,只有在到達(dá) pctfree 時(shí)才會(huì)將數(shù)據(jù)塊由 freelist 中移走。
表格和索引存儲(chǔ)參數(shù)設(shè)置的要求總結(jié)
以下的一些規(guī)則是用來(lái)設(shè)置 freelists, freelist groups, pctfree 和 pctused 存儲(chǔ)參數(shù)的。你也知道, pctused 和 pctfree 的值是可以很容易地通過(guò) alter table 命令修改的,一個(gè)好的 DBA 應(yīng)該知道如何設(shè)置這些參數(shù)的***值。
有效地使用空間和高性能之間是有矛盾的,而表格的存儲(chǔ)參數(shù)就是控制這個(gè)方面的矛盾:
對(duì)于需要有效地重新使用空間,可以設(shè)置一個(gè)高的 pctused 值,不過(guò)副作用是需要額外的 I/O 。一個(gè)高的 pctused 值意味著相對(duì)滿的塊都會(huì)放到 freelist 中。因此,這些塊在再次滿之前只可以接受幾行記錄,從而導(dǎo)致更多的 I/O 。
追求高性能的話,可以將 pctused 設(shè)置為一個(gè)低的值,這意味著 Oracle 數(shù)據(jù)庫(kù)不會(huì)將數(shù)據(jù)塊放到 freelists 中直到它幾乎是空的。那么塊將可以在滿之前接收更多的行,因此可以減少插入操作的 I/O 。要記住 Oracle 擴(kuò)展新塊的性能要比重新使用現(xiàn)有的塊高。對(duì)于 Oracle 來(lái)說(shuō),擴(kuò)展一個(gè)表比管理 freelists 消耗更少的資源。
文章出自:http://database.csdn.net/page/96f66c75-55bb-42a7-9bdf-e402705c85e5
【編輯推薦】