IBM的DB2 V9 引入了自動自調整內存管理,自適應的自調整內存功能通過自動設置內存配置參數值以及調整緩沖池大小來簡化內存配置任務。啟用此功能後,內存調整器就會在幾個內存使用者(包括:排序、程序包高速緩存、鎖定列表和緩沖池)之間動態地分配可用內存資源,從而簡化了內存配置參數調整的工作量。本文重點介紹在DB2? V9中如何使用自動自調整內存,包括如何啟用自調整內存,禁用自調整內存以及自調整內存相關的幾個內存配置參數等。
簡介
在DB2 V9之前,數據庫的內存配置參數和緩沖池都是由管理員手工設置的。而數據庫的工作負載很少是靜態的,而是動態變化的。比如,當工作負載類型發生變化(由事務型變成了混合型等)、用戶增加、維護任務的運行或者其它應用程序消耗的資源變化等,都會造成工作負載在不停的變化。因此,即便是資深的數據庫管理員調優過的系統,在另一個時候也未必是最優的。數據庫管理員需要根據變化隨時做出調整,工作量大而效果也不明顯。變化可能在很短的時間內發生,因此留給數據庫管理員作出響應的時間很短。數據庫內存設置尤其容易受這些變化的影響,因而會嚴重影響響應時間。
現在,從IBM? DB2?版本 9 開始,新的內存調整功能自動設置若干內存配置參數值,從而簡化了內存配置任務。啟用此功能後,內存調整器就會在幾個內存使用者(包括排序、程序包高速緩存、鎖定列表和緩沖池)之間動態地分配可用內存資源。內存調整器對工作負載特征的顯著更改作出響應,從而調整內存配置參數值和緩沖池大小以優化性能。
本文重點介紹在DB2? V9中如何使用自動自調整內存。
我們將按照下列順序介紹自動自調整內存:
?自動自調整內存概述
?啟用自動自調整內存
?與自調整相關的內存管理參數
?禁用自動自調整內存
自動自調整內存概述
DB2 V9的自動自調整內存功能能夠簡化若干個內存配置參數的調整。除了簡化內存配置任務之外,此新增的自適應的自調整內存功能通過提供更高的配置來提高性能,該配置可以動態響應工作負載特征中出現的重要變化。自調整內存管理器使用智能控制和反饋機制來跟蹤工作負載特征、內存消耗以及對數據庫中各種共享資源的需求的變化,並根據需要動態調整它們對內存的使用。例如,如果排序操作需要更多的內存,而一些緩沖池又有多余的內存,那麼內存管理器會釋放多余的緩沖池內存,並將它分配給排序堆。
缺省情況下,已對單一分區數據庫啟用自調整內存功能,並對多分區數據庫禁用此功能。也就是說,在 V9.1 中創建單一分區數據庫時,self_tuning_mem 數據庫配置參數會自動設置為 ON,如果不需要啟用自調整內存管理器,則可在創建數據庫之後通過將 self_tuning_mem 配置參數設置為 OFF 來關閉該管理器;在 DPF 系統上不會默認啟用自調整內存管理器。
在 Windows? 和 AIX? 平台上(也僅在這兩個平台上),自調整內存功能還可確定數據庫內存的總需求,並會動態地對數據庫共享內存的總體使用情況進行調整。這使數據庫管理器可以根據工作負載的需要消耗更多物理內存,而在數據庫內存需求降低時將這些內存釋放到操作系統中。
另外,如果將數據庫從 V8 遷移至 V9.1,則不會自動啟用此功能。要在已遷移的數據庫中使用此功能,必須手工啟用它。可以通過將 self_tuning_mem 配置參數設置為 ON 並將下列某些或全部配置參數設置為 AUTOMATIC 來啟用自調整內存:
?pckcachesz
?locklist 和maxlocks
?sortheap 和sheapthres_shr
?database_memory(其 AUTOMATIC 設置僅在 AIX? 和 Windows? 操作系統上受支持。在其他平台上,database_memory 的缺省值是 COMPUTED)。
自適應的自調整內存功能通過自動設置內存配置參數值以及調整緩沖池大小來簡化內存配置任務。啟用此功能後,內存調整器就會在幾個內存使用者(包括:排序、程序包高速緩存、鎖定列表和緩沖池)之間動態地分配可用內存資源。
可以對下列內存使用者啟用自調整(把相應的參數設置為 AUTOMATIC):
?緩沖池(由 ALTER BUFFERPOOL 和 CREATE BUFFERPOOL 語句指定AUTOMATIC屬性)。
?程序包高速緩存(由 pckcachesz 配置參數控制)。
?鎖定內存(由 locklist 和 maxlocks 配置參數控制)。
?排序內存(由 sheapthres_shr 和 sortheap 配置參數控制)。
?數據庫共享內存(由 database_memory 配置參數控制)。
接下來我們通過具體的例子來看一下如何使用自動自調整內存。
啟用自調整內存功能
首先我們創建一個單一分區數據庫MYDB1,由於默認情況下,單一分區數據庫啟用自調整內存功能,所以我們創建的示例數據庫MYDB1就啟動了自動自調整內存功能,其數據庫參數self_tuning_mem被自動設置成了ON,並把程序包高速緩存、鎖定內存、排序內存和數據庫共享內存等內存使用者默認啟動了自動自調整內存功能,默認創建的緩沖池IBMDEFAULTBP也啟用了自調整內存功能。我們在DB2CMD窗口中,發出CREATE DB 命令,創建示例數據庫MYDB1具體如清單1所示:
--清單 1. 創建啟用自動自調整內存的示例數據庫MYDB1C:\>DB2 CREATE DATABASE MYDB1DB20000I CREATE DATABASE命令成功完成。
我們通過GET DB CFG命令查看示例數據庫MYDB1的配置參數,會發現其自調整內存參數(self_tuning_mem)被設置成了ON,數據庫共享內存大小(DATABASE_MEMORY) 、 鎖定列表的最大存儲量參數(LOCKLIST)、 每個應用程序的鎖定百分比列表參數(MAXLOCKS)、 程序包高速緩存大小參數(PCKCACHESZ)、 共享排序的排序堆域值參數(SHEAPTHRES_SHR)和 排序列表堆參數(SORTHEAP)都被設置成了AUTOMATIC,表示這些參數啟用自動自調整內存,另外數據庫內存阈值參數(DB_MEM_THRESH)被設置成了10。
DB2 V9中新增了數據庫配置參數 db_mem_thresh,以控制有多少物理 RAM 被 database_memory 參數的未使用部分占用。此數據庫配置參數指定數據庫管理器如何處理未用數據庫共享內存過多這一問題。通常,當進程訪問內存頁時,內存頁處於已落實狀態,這表示操作系統已分配了該內存頁,並且該內存頁占用物理內存空間或磁盤上的頁文件空間。根據數據庫的工作負載,數據庫共享內存需求在一天中的某些時間可能會達到峰值。一旦操作系統有足夠的已落實內存來滿足那些峰值需求後,該內存就會一直處於已落實狀態,即使內存需求從峰值回落亦如此。此數據庫配置參數表示數據庫管理器允許的已落實但當前未使用的數據庫共享內存最大百分比,達到此百分比後,數據庫管理器將開始釋放已落實的內存頁以將它們返回給操作系統。可接受的值是整數 0(立即釋放任何未使用的數據庫共享內存)到 100(永遠不釋放任何未使用的數據庫共享內存)。缺省值是 10(僅當當前未使用的數據庫共享內存超過 10% 時,才釋放那些內存)。
具體情況如清單2所示:
--清單 2. 查看示例數據庫MYDB1配置參數C:\>DB2 GET DB CFG FOR MYDB1數據庫 MYDB1 的數據庫配置數據庫配置發行版級別 = 0x0b00數據庫發行版級別 = 0x0b00數據庫地域 = CN數據庫代碼頁 = 1386數據庫代碼集 = GBK數據庫國家/地區代碼 = 86數據庫整理順序 = UNIQUE備用整理順序 (ALT_COLLATE) =數據庫頁大小 = 4096.......自調整內存 (SELF_TUNING_MEM) = ON數據庫共享內存大小(4KB) (DATABASE_MEMORY) = AUTOMATIC數據庫內存阈值 (DB_MEM_THRESH) = 10鎖定列表的最大存儲量(4KB) (LOCKLIST) = AUTOMATIC每個應用程序的鎖定百分比列表 (MAXLOCKS) = AUTOMATIC程序包高速緩存大小(4KB) (PCKCACHESZ) = AUTOMATIC共享排序的排序堆域值(4KB) (SHEAPTHRES_SHR) = AUTOMATIC排序列表堆(4KB) (SORTHEAP) = AUTOMATIC........
清單2中所示的程序包高速緩存大小(PCKCACHESZ)參數,是在數據庫共享內存之外分配的,並且用於高速緩存數據庫上的靜態和動態 SQL 和 XQuery 語句的部分。高速緩存程序包使數據庫管理器在重新裝入程序包時可以不訪問系統目錄;或者對於動態 SQL 或 XQuery 語句,可以免去編譯這一步,從而減少其內部開銷。將這些段保存在程序包高速緩存中,直到發生下列其中一種情況:
?數據庫關閉 。
?程序包或動態 SQL 或 XQuery 語句無效 。
?高速緩存空間用完。
靜態或動態 SQL 或 XQuery 語句節的高速緩存可提供性能,尤其是在與數據庫連接的應用程序多次使用同一個語句時。這在事務處理應用程序中特別重要。當此參數設置為 AUTOMATIC 時,就啟用了自調整功能。當 self_tuning_mem 設置為 ON 時,內存調整器將在工作負載需求更改時動態調整 pckcachesz 控制的內存區的大小。由於內存調整器在不同內存使用者之間交換內存資源,所以,必須至少有兩個內存使用者啟用自調整功能才能使自調整功能有效。需要注意的是,程序包高速緩存是工作高速緩存,所以不能將此參數設置為零。此高速緩存中必須分配有足夠的內存以保存當前執行的 SQL 或 XQuery 語句的所有節。如果分配的空間比當前需要的空間多,則各節被高速緩存。下一次需要這些部分時,只需執行它們而不必將其裝入或進行編譯。由 pckcachese 參數指定的限制是軟限制。如果數據庫共享集合中還有可用的內存,如果有必要的話,可以超過該限制。
清單2中所示的鎖定列表的最大存儲量 (LOCKLIST)參數,是用來指示分配給鎖定列表的內存量。每個數據庫有一個鎖定列表,鎖定列表包含由同時連接至數據庫的所有應用程序掛起的鎖定。鎖定是數據庫管理器用來控制多個應用程序並發訪問數據庫中的數據的機制。行和表都可以鎖定。數據庫管理器還可以獲取鎖定來供內部使用。當此參數設置為 AUTOMATIC 時,就啟用了自調整功能。這允許內存調整器根據工作負載需求變化動態地調整此參數控制的內存區大小。由於內存調整器在不同內存使用者之間交換內存資源,所以,必須至少有兩個內存使用者啟用自調整功能才能使自調整功能有效。locklist 值是與 maxlocks 參數一起調整的,因此,如果禁用 locklist 參數自調整功能,也將自動禁用 maxlocks 參數自調整功能。如果啟用 locklist 參數自調整功能,也將自動啟用 maxlocks 參數自調整功能。當一個應用程序使用的鎖定列表百分比達到 maxlocks 時,數據庫管理器就會對該應用程序掛起的鎖定執行從行到表的鎖定升級。雖然升級過程本身花不了多少時間,但是鎖定整個表(與個別行比較)降低了並發性,並且可能因對受影響的表進行後續訪問而降低整個數據庫性能。關於如何控制鎖定列表大小的建議是:
?經常執行 COMMIT 以釋放鎖定。
?當執行很多更新時,在更新前鎖定整個表(使用 SQL LOCK TABLE 語句)。這樣將只使用一個鎖定,防止其他鎖定干擾更新,但卻降低了數據的並發性。
?還可以使用 ALTER TABLE 語句的 LOCKSIZE 選項來控制如何對特定表進行鎖定。
?使用“可重復讀”隔離級別可能會導致自動表鎖定。
只要有可能,使用“游標穩定性”隔離級別以減少所掛起的共享鎖定數。如果不會影響到應用程序的完整性需求,則使用“未落實的讀”代替“游標穩定性”以進一步減少鎖定量。 將 locklist 設置為 AUTOMATIC。鎖定列表將同步地增大以避免發生鎖定升級或鎖定列表滿的情況。 一旦鎖定列表已滿,性能就可能會降低,因為鎖定升級將生成更多的表鎖定和更少的行鎖定,從而降低數據庫中共享對象的並發性。另外,應用程序間可能有更多的死鎖(因為這些應用程序都在等待有限數目的表鎖定),這樣將導致事務回滾。當數據庫的鎖定請求數達到最大值時,應用程序將接收到值為 -912 的 SQLCODE。
清單2中所示的每個應用程序的鎖定百分比列表(MAXLOCKS)參數,是用來定義應用程序所掛起的鎖定列表的百分比,和locklist一起決定了每個應用程序可以使用的鎖定數量,超過了將引發鎖升級。當此參數設置為 AUTOMATIC 時,就啟用了自調整功能。這允許內存調整器根據工作負載需求變化動態地調整此參數控制的內存區大小。由於內存調整器在不同內存使用者之間交換內存資源,所以,必須至少有兩個內存使用者啟用自調整功能才能使自調整功能有效。
清單2中所示的共享排序的排序堆域值 (SHEAPTHRES_SHR)參數,是表示對排序內存使用者每次可使用的數據庫共享內存總量的軟限制。除排序以外,還有其他排序內存使用者(例如,散列連接、索引 AND 運算、塊索引 AND 運算、合並連接和內存表)。當共享排序內存使用者的共享內存總量達到 sheapthres_shr 限制時,就會激活內存調節機制,將來的共享排序內存使用者請求得到的內存量將少於請求的內存量,但始終多於完成任務所需的最低內存量。一旦達到 sheapthres_shr 限制,排序內存使用者的所有共享排序內存請求都將獲得完成任務所必需的最低內存量。當活動共享排序內存使用者的共享內存總量達到此限制時,後續排序可能會失敗(SQL0955C)。當數據庫管理器配置參數 sheapthres 值為 0 時,數據庫的所有排序內存使用者都將使用 sheapthres_shr 控制的數據庫共享內存,而不是使用專用排序內存。當 sheapthres_shr 設置為 AUTOMATIC 時,就啟用了自調整功能。這允許內存調整器根據工作負載需求變化動態地調整此參數控制的內存區大小。由於內存調整器在不同內存使用者之間交換內存資源,所以,必須至少有兩個內存使用者啟用自調整功能才能使自調整功能有效。內存使用者包括 SHEAPTHRES_SHR、PCKCACHESZ、BUFFER POOL(每個緩沖池計數為一個)、LOCKLIST 和 DATABASE_MEMORY。僅當數據庫管理器配置參數 sheapthres 設置為 0 時,才允許自動調整 sheapthres_shr。sortheap 值是與 sheapthres_shr 參數一起調整的,因此,如果禁用 sortheap 參數自調整功能,也將自動禁用 sheapthres_shr 參數自調整功能。如果啟用 sheapthres_shr 參數自調整功能,也將自動啟用 sortheap 參數自調整功能。
清單2中所示的排序列表堆(SORTHEAP) 參數,是定義要用於專用排序的專用內存頁的最大數目或要用於共享排序的共享內存頁的最大數目。當排序完成時,如果排序為專用排序,那麼此參數將影響代理程序專用內存。如果排序為共享排序,那麼此參數將影響數據庫共享內存。每個排序都有一個獨立的排序堆,該排序堆由數據庫管理器根據需要分配。此排序堆是將數據排序的區域。如果由優化器定向,那麼將使用優化器提供的信息分配一個比此參數指定的排序堆小的排序堆。當此參數設置為 AUTOMATIC 時,就啟用了自調整功能。這允許內存調整器根據工作負載需求變化動態地調整此參數控制的內存區大小。當使用排序堆時,應該考慮下列事項:
?適當的索引可使排序堆的使用減至最小程度。
?散列連接緩沖區、塊索引 AND 運算、合並連接、內存中的表以及動態位映射(用於索引 AND 運算和星型連接)使用排序堆內存。在使用這些技術時,增大此參數的大小。
?當需要進行頻繁的大型排序時,增大此參數的大小。
?當增大此參數的值時,應該檢查是否還需要調整數據庫管理器配置文件中的 sheapthres 和 sheapthres_shr 參數。
?排序堆大小由優化器在確定訪問路徑時使用。在更改此參數後,應考慮重新綁定應用程序(使用 REBIND 命令)。
清單2中所示的數據庫共享內存大小 (DATABASE_MEMORY)參數,是用來設置對每個數據庫將使用的內存量的限制。在 DB2? V9.1 中,database_memory 配置參數的 COMPUTED 設置等價於 DB2 UDB V8 AUTOMATIC 設置。如果要保留 DB2 V8 行為,則將 database_memory 參數設置為 COMPUTED。在 DB2 V9.1 中,將 database_memory 參數設置為 AUTOMATIC 會啟用新增的自調整內存管理功能部件,它可自動調整數據庫內存使用。調整器在 database_memory 配置參數定義的內存限制范圍內工作。在 Windows? 和 AIX? 上,database_memory 值本身可以自動調整。database_memory 啟用自調整(設置為 AUTOMATIC)後,調整器確定數據庫的整體內存需求並根據當前數據庫需求增大或減小分配給數據庫共享內存的內存量。例如,如果當前數據庫需求很高,並且系統上有足夠的可用內存,則數據庫共享內存將消耗較多的內存。當數據庫內存需求下降時,或者當系統上的可用內存量降至過低水平時,就會釋放一些數據庫共享內存。database_memory 參數未啟用自調整(未設置為 AUTOMATIC)時,整個數據庫都將使用指定的內存量,從而根據需要在數據庫內存使用者之間分配內存。database_memory 未啟用自調整時,可以通過兩種方法指定數據庫使用的內存量:將 database_memory 設置為數值或者將其設置為 COMPUTED。在第二種情況下,總內存量是根據數據庫啟動時的數據庫內存堆初始值總計而計算的。一定要注意:database_memory 的 AUTOMATIC 設置僅在 AIX? 和 Windows? 操作系統上受支持。在其他平台上,database_memory 的缺省值是 COMPUTED。
接下來我們查看一下默認創建的4K頁緩沖池IBMDEFAULTBP的自調整設置,具體如清單3所示:
--清單 3. 查看默認創建的4K頁緩沖池IBMDEFAULTBP的自調整設置C:\>db2 connect to mydb1數據庫連接信息數據庫服務器 = DB2/NT 9.1.0SQL 授權標識 = RHETTE本地數據庫別名 = MYDB1C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools"BPNAME NPAGES------------------------------------------------ -----------IBMDEFAULTBP -21 條記錄已選擇。
當緩沖池啟用了自調整功能時,該特定緩沖池的 sysibm.sysbufferpools 表中的 NPAGES 字段將設置為 -2。當自調整功能處於禁用狀態時,NPAGES 字段將設置為緩沖池的當前大小。我們可以在清單2中看到,IBMDEFAULTBP的NPAGES 字段將設置為 -2,由此我們可以確定,IBMDEFAULTBP啟用了自調整功能。
下面我們創建示例緩沖池MYBP1,其使用自調整功能(注意其create bufferpool語句使用了automatic),初始大小為400K,具體如清單4所示:
--清單 4. 創建使用自動自調整功能的示例緩沖池MYBP1C:\>db2 create bufferpool mybp1 immediate size 100 automatic pagesize 4kDB20000I SQL命令成功完成。
接下來創建示例緩沖池MYBP2,其不使用自調整功能,,初始大小為400K,具體如清單5所示:
--清單 5. 創建不使用自動自調整功能的示例緩沖池MYBP2C:\>db2 create bufferpool mybp2 immediate size 100 pagesize 4kDB20000I SQL命令成功完成。
此時我們通過訪問sysibm.sysbufferpools可以看到mybp1的NPAGES字段設置成了-2,而mybp2的NPAGES字段都設置成了100,具體如清單6所示:
--清單 6. 查看緩沖池C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools"BPNAME NPAGES------------------------------------------------ -----------IBMDEFAULTBP -2MYBP1 -2MYBP2 1003 條記錄已選擇。
現在我們將mybp2改成使用自調整功能,在DB2CMD環境中,執行ALTER BUFFERPOOL命令,具體如清單7所示:
--清單 7. 修改示例緩沖池MYBP2,使其啟用自調整功能C:\>db2 alter bufferpool mybp2 immediate size 100 automaticDB20000I SQL命令成功完成。再次通過訪問sysibm.sysbufferpools可以看到mybp1和mybp2的NPAGES字段都設置成了-2,具體如清單8所示:
--清單 8. 查看緩沖池C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools"BPNAME NPAGES------------------------------------------------ -----------IBMDEFAULTBP -2MYBP1 -2MYBP2 -23 條記錄已選擇。
如果數據庫是從V8遷移過來,或者被手工設置過禁止使用自調整內存功能,又想重新使用自動自調整內存功能,可以按如下步驟進行操作:
?通過將 self_tuning_mem 設置為 ON 來對數據庫啟用自調整功能。可以使用 UPDATE DATABASE CONFIGURATION 命令、SQLFUPD API 或通過控制中心中的更改數據庫配置參數窗口來將 self_tuning_mem 設置為 ON。
?要對由內存配置參數控制的內存區域啟用自調整功能,請使用 UPDATE DATABASE CONFIGURATION 命令、SQLFUPD API 或通過控制中心中的更改數據庫配置參數窗口將相關配置參數設置為 AUTOMATIC。
?要對緩沖池啟用自調整功能,請將緩沖池大小設置為 AUTOMATIC。可以使用 ALTER BUFFER POOL 語句(對於現有緩沖池)或 CREATE BUFFER POOL 語句(對於新緩沖池)來完成此操作。如果在 DPF 環境中將緩沖池大小設置為 AUTOMATIC,就不應該在 sysibm.sysbufferpoolnodes 中為該緩沖池定義任何條目。
需要注意:
?由於自調整功能在不同內存區域之間重新分配內存,所以,必須至少啟用兩個內存區域(例如鎖定內存區域和數據庫共享內存區域)才能使自調整功能起作用。唯一的例外是由 sortheap 配置參數控制的內存。當僅將 sortheap 設置為 AUTOMATIC 時,將啟用 sortheap 的自調整功能。
?要為自調整功能啟用 locklist 配置參數,還必須為自調整功能啟用 maxlocks,因此當 locklist 設置為 AUTOMATIC 時,maxlocks 也設置為 AUTOMATIC。要為自調整功能啟用 sheapthres_shr 配置參數,還必須為自調整功能啟用 sortheap,因此當 sheapthres_shr 設置為 AUTOMATIC 時,sortheap 也設置為 AUTOMATIC。
?僅當數據庫管理器配置參數 sheapthres 設置為 0 時,才允許自動調整 sheapthres_shr 或 sortheap。
?自調整內存功能僅在 HADR 主服務器上運行。在 HARD 系統上激活自調整內存功能後,永遠不會在輔助服務器上運行此功能,並且,僅當正確地設置配置後,此功能才會在主服務器上運行。如果運行了切換 HADR 數據庫角色的命令,自調整內存操作也會切換,從而在新的主服務器上運行。
禁用自動自調整內存
對啟用自動自調整內存的數據庫,可以通過將將 self_tuning_mem 設置為 OFF 來對整個數據庫禁用自調整功能。當 self_tuning_mem 設置為 OFF 時,設置為 AUTOMATIC 的內存配置參數和緩沖池仍為 AUTOMATIC,並且內存區保持其當前大小不變。
接下來我們對示例數據庫MYDB1禁用自動自調整內存,使用UPDATE DB CFG命令先把self_tuning_mem設置成OFF,具體如清單9所示:
--清單 9. 禁用自動自調整內存C:\>db2 update db cfg using self_tuning_mem offDB20000I UPDATE DATABASE CONFIGURATION命令成功完成。我們在上面啟動自調整內存的時候講過,由於自調整功能在不同內存區域之間重新分配內存,所以,必須至少啟用兩個內存區域(例如鎖定內存區域和數據庫共享內存區域)才能使自調整功能起作用。唯一的例外是由 sortheap 配置參數控制的內存。當僅將 sortheap 設置為 AUTOMATIC 時,將啟用 sortheap 的自調整功能。 所以,如果只有一個內存使用者啟用了自調整功能(sortheap除外),則還可以有效地對整個數據庫取消激活自調整功能,這個時候雖然self_tuning_mem參數被設置成ON,但整個數據庫還是取消激活自調整功能。這是因為,當僅啟用了一個內存區時,不能對內存進行再分布。
--清單 10. 對locklist禁用自動自調整內存功能C:\>db2 update db cfg using locklist manualSQL5146W 當 "LOCKLIST" 為 "MANUAL" 時,必須將 "MAXLOCKS" 設置為"MANUAL"。"MAXLOCKS" 已設置為 "MANUAL"。如清單10所示,當把locklist禁用自調整功能後,maxlocks也被禁止使用自調整功能。把locklist設置成manual的意思是指對locklist禁用自調整功能,而locklist的當前值(動態調整的參數,在一段時間內是動態的,但在某一個時點,其是靜態的,都有一個當前值)保持不變。把maxlocks設置成manual也是同樣的意思,就是對maxlocks禁用自調整功能,而maxlocks的當前值也保持不變。此時我們用get db cfg show detail的方式查看數據庫配置參數,可以發現locklist和maxlocks的值都被改成固定的值了,具體如清單11所示:
如果要禁用sortheap自調整功能,並同時將sortheap的當前值更改為1000的話,可以如清單12所示進行修改:
--清單 12. 對sortheap禁用自調整功能C:\>db2 update db cfg using sortheap 1000 SHEAPTHRES_SHR 260SQL5155W 成功完成更新。SORTHEAP 的當前值可能對性能產生負面影響。對其他的內存配置參數也禁用自調整功能,具體如清單13所示:
--清單 13. 對DATABASE_MEMORY、PCKCACHESZ禁用自調整功能C:\>db2 update db cfg using DATABASE_MEMORY manualDB20000I UPDATE DATABASE CONFIGURATION命令成功完成。C:\>db2 update db cfg using PCKCACHESZ manualDB20000I UPDATE DATABASE CONFIGURATION命令成功完成。
對緩沖池禁用自調整功能,可以通過將緩沖池的大小設成-1或固定值的方式,該緩沖池的 NPAGES 值為 -1 時,DB2 數據庫配置參數 BUFFPAGE 控制著緩沖池的大小。當值為-2的時候,代表啟用自調整功能(真正有效需要兩個方面的因素,第一,需要self_tuning_mem參數設置為ON,第二,至少還存在一個別的內存區域,比如DATABASE_MEMORY)。具體如清單14所示:
--清單 14. 對緩沖池禁用自調整功能C:\>db2 alter bufferpool mybp1 size 100DB20000I SQL命令成功完成。C:\>db2 alter bufferpool mybp2 size 100DB20000I SQL命令成功完成。C:\>db2 alter bufferpool ibmdefaultbp size 100DB20000I SQL命令成功完成。
此時我們通過訪問sysibm.sysbufferpools可以看到mybp1、mybp2和ibmdefaultbp的NPAGES字段都設置成了100了,具體如清單15所示:
-清單 15. 查看緩沖池BPNAME NPAGES---------------------------- -----------IBMDEFAULTBP100MYBP1100MYBP21003 條記錄已選擇。
以上,我們對自調整內存進行了詳細的介紹,不過,自調整內存也存在著局限性,在少量內存可用的情況下(例如,因為 database_memory 的值設置得很小,或者因為多個數據庫、實例或其他應用程序正在服務器上運行),自調整內存帶來的性能好處將有限。
因為自調整內存根據數據庫工作負載作出調整決定,所以內存特征不斷變化的工作負載將限制自調整內存的能力以有效地進行調整。如果工作負載的內存特征不斷變化,則自調整內存調整內存的頻率將會降低,並且將重復調整以改變目標條件。在這種情況下,自調整內存將無法獲得絕對匯合,而是嘗試維護調整為當前工作負載的內存配置。