本文主要講述的是如何調整 Oracle 數據庫的競爭 ,我們大家都知道Oracle 的其中一個最大的優點就是它可以管理每個相關表空間中的一些自由空間。 Oracle 負責處理表和索引的空間管理,這樣就可以讓我們無需懂得 Oracle 的表和索引的內部運作。
不過,對於有經驗的 Oracle 調優專家來說,他需要懂得 Oracle 是如何管理表的 extent 和空閒的數據塊。對於調整擁有高的 insert 或者 update 的系統來說,這是非常重要的。
要精通對象的調整,你需要懂得 freelists 和 freelist 組的行為,它們和 pctfree 及 pctused 參數的值有關。這些知識對於企業資源計劃( ERP )的應用是特別重要的,因為在這些應用中,不正確的表設置通常是 DML 語句執行慢的原因。
對於初學者來說,最常見的錯誤是認為默認的 Oracle 數據庫參數對於所有的對象都是最佳的。除非磁盤的消耗不是一個問題,否則在設置表的 pctfree 和 pctused 參數時,就必須考慮平均的行長和數據庫的塊大小,這樣空的塊才會被有效地放到 freelists 中。當這些設置不正確時,那些得到的 freelists 也是 "dead" 塊,因為它們沒有足夠的空間來存儲一行,這樣將會導致明顯的處理延遲。
Freelists 對於有效地重新使用 Oracle 表空間中的空間是很重要的,它和 pctfree 及 pctused 這兩個存儲參數的設置直接相關。通過將 pctused 設置為一個高的值,這時數據庫就會盡快地重新使用塊。不過,高性能和有效地重新使用表的塊是對立的。
在調整 Oracle 的表格和索引時,需要認真考慮究竟需要高性能還是有效的空間重用,並且據此來設置表的參數。以下我們來看一下這些 freelists 是如何影響 Oracle 的性能的。
當有一個請求需要插入一行到表格中時, Oracle 數據庫就會到 freelist 中尋找一個有足夠的空間來容納一行的塊。你也許知道, freelist 串是放在表格或者索引的第一個塊中,這個塊也被稱為段頭( segment header )。 pctfree 和 pctused 參數的唯一目的就是為了控制塊如何在 freelists 中進出。
雖然 freelist link 和 unlink 是簡單的 Oracle 功能,不過設置 freelist link (pctused) 和 unlink (pctfree) 對 Oracle 的性能確實有影響。
由 DBA 的基本知識知道, pctfree 參數是控制 freelist un-links 的(即將塊由 freelists 中移除)。設置 pctfree=10 意味著每個塊都保留 10% 的空間用作行擴展。 pctused 參數是控制 freelist re-links 的。設置 pctused=40 意味著只有在塊的使用低於 40% 時才會回到表格的 freelists 中。
許多新手對於一個塊重新回到 freelists 後的處理都有些誤解。其實,一旦由於一個刪除的操作而令塊被重新加入到 freelist 中,它將會一直保留在 freelist 中即使空間的使用超過了 60% ,只有在到達 pctfree 時才會將數據塊由 freelist 中移走。
表格和索引存儲參數設置的要求總結
以下的一些規則是用來設置 freelists, freelist groups, pctfree 和 pctused 存儲參數的。你也知道, pctused 和 pctfree 的值是可以很容易地通過 alter table 命令修改的,一個好的 DBA 應該知道如何設置這些參數的最佳值。
有效地使用空間和高性能之間是有矛盾的,而表格的存儲參數就是控制這個方面的矛盾:
對於需要有效地重新使用空間,可以設置一個高的 pctused 值,不過副作用是需要額外的 I/O 。一個高的 pctused 值意味著相對滿的塊都會放到 freelist 中。因此,這些塊在再次滿之前只可以接受幾行記錄,從而導致更多的 I/O 。
追求高性能的話,可以將 pctused 設置為一個低的值,這意味著 Oracle 數據庫不會將數據塊放到 freelists 中直到它幾乎是空的。那麼塊將可以在滿之前接收更多的行,因此可以減少插入操作的 I/O 。要記住 Oracle 擴展新塊的性能要比重新使用現有的塊高。對於 Oracle 來說,擴展一個表比管理 freelists 消耗更少的資源。