• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            OLTP 應(yīng)用程序的 DB2 調(diào)優(yōu)技巧

            Posted on 2010-04-19 22:54 Prayer 閱讀(369) 評論(0)  編輯 收藏 引用 所屬分類: DB2

            2003 年 8 月 01 日

            本文介紹了使用 OLTP 應(yīng)用程序的有關(guān)性能的一些基本要素,并包括了有關(guān)更新目錄統(tǒng)計信息以及監(jiān)控和調(diào)優(yōu)數(shù)據(jù)庫配置參數(shù)的信息。

            簡介

            DB2 Universal Database®(UDB)是第一個支持多媒體和 Web 的關(guān)系數(shù)據(jù)庫管理系統(tǒng),它的功能非常強(qiáng)大,足以滿足大公司的需求,并且它非常靈活,足以滿足中小企業(yè)的要求。DB2 產(chǎn)品系列軟件和因特網(wǎng)技術(shù)的結(jié)合使我們可以方便地跨不同平臺訪問信息、使用信息并且保證信息安全。全世界有 30 多萬家公司的 6000 多萬個 DB2 用戶依賴于 IBM 數(shù)據(jù)管理解決方案。

            DB2 UDB 為大多數(shù)需要電子商務(wù)的應(yīng)用程序(比如電子商務(wù)、企業(yè)資源計劃、客戶關(guān)系管理、供應(yīng)鏈管理、Web 自助服務(wù)和商業(yè)智能)提供支持。這是一種可伸縮的、工業(yè)級數(shù)據(jù)庫,非常適合用作電子商務(wù)發(fā)展過程中的數(shù)據(jù)管理基礎(chǔ)。

            聯(lián)機(jī)事務(wù)處理(Online transaction processing,OLTP)是一類能為面向事務(wù)應(yīng)用程序提供便利的應(yīng)用程序,并可用來管理面向事務(wù)的應(yīng)用程序,它通常用于處理許多行業(yè)的數(shù)據(jù)輸入和檢索事務(wù),這些行業(yè)包括銀行、航空、郵購、超市和制造業(yè)。通常,OLTP 工作負(fù)載包括許多并發(fā)運行的短事務(wù)。如今的聯(lián)機(jī)事務(wù)處理日益要求支持跨網(wǎng)絡(luò)以及可能包括多家公司的事務(wù)。因此,新的 OLTP 軟件使用了客戶機(jī)/服務(wù)器處理和代理軟件,這種軟件允許事務(wù)在一個網(wǎng)絡(luò)的不同計算機(jī)平臺上運行。

            在任何一種數(shù)據(jù)庫系統(tǒng)中,性能是最重要的因素之一。本文根據(jù)由運行 OLTP 類型的性能基準(zhǔn)測試程序(TPC-C、TPC-W、Trade2 等)所得到的經(jīng)驗,著重討論了許多 DB2 性能調(diào)優(yōu)技巧。雖然數(shù)據(jù)庫應(yīng)用程序的性能會受許多因素影響,但是我們著重討論配置而不是諸如容量規(guī)劃、數(shù)據(jù)庫設(shè)計或應(yīng)用程序設(shè)計之類的因素。

            本文的組織結(jié)構(gòu)如下:

            有關(guān)性能的一些基本要素

            更新目錄統(tǒng)計信息,這部分強(qiáng)調(diào)收集和維護(hù)最新數(shù)據(jù)庫統(tǒng)計信息的重要性,缺少這項工作常常是導(dǎo)致許多性能問題的源頭所在。

            監(jiān)控和調(diào)優(yōu)數(shù)據(jù)庫配置參數(shù),這部分按照重要性的順序描述了一列數(shù)據(jù)庫管理器參數(shù)和數(shù)據(jù)庫參數(shù)。通常,沒必要嘗試列表中的所有參數(shù)以實現(xiàn)性能目標(biāo)??梢灾粐L試其中位于列表頂部的那幾個,以查看是否有性能方面的改進(jìn)。

            有了這些技巧,就可以啟動自己的 OLTP 應(yīng)用程序并使其擁有非常好的運行性能。





            回頁首


            有關(guān)性能的一些基本要素

            1. 有足夠的內(nèi)存。
              • 對于 32 位系統(tǒng),每個 CPU 至少使用 512 MB 的 RAM,最高可達(dá)每臺機(jī)器 4 GB,以支持大量并發(fā)用戶所需的緩沖池、DB2 代理程序和其它共享內(nèi)存對象。(請參閱 “緩沖池大?。˙UFFPAGE)”一節(jié)以獲取有關(guān)緩沖池的更多信息。)可能需要更多的內(nèi)存來支持在本地運行或作為存儲過程運行的應(yīng)用程序。在 AIX® 上 JFS 文件高速緩存可以使用額外的內(nèi)存來補(bǔ)充緩沖池。
              • 對于 64 位系統(tǒng),緩沖池實際上可以是任何大小。但是,對于使用大型數(shù)據(jù)庫的大多數(shù)電子商務(wù) OLTP 應(yīng)用程序,緩沖池大小實際上不需要超過 8 GB。越大當(dāng)然越好,但是在某一點,當(dāng)緩沖池命中率達(dá)到 98+% 時,會隨內(nèi)存的增加命中率反而下降。并發(fā)用戶的數(shù)目(它影響 DB2 代理程序的數(shù)量)決定需要多少內(nèi)存。
              • 每個用戶連接至數(shù)據(jù)庫(即 DB2 代理程序)所需的內(nèi)存數(shù)量取決于應(yīng)用程序所執(zhí)行的 SQL 語句的性質(zhì) - 比如打開的并發(fā)游標(biāo)數(shù)以及所需的排序和臨時空間的數(shù)量。對于 OLTP 應(yīng)用程序,所需的排序和臨時空間會比較少,一次只打開少數(shù)并發(fā)游標(biāo)。
              • 經(jīng)驗:對于每個 DB2 代理程序,在 UNIX 中最少使用 1 MB 內(nèi)存,在 Windows 中最少使用 500 KB 內(nèi)存。如果使用了受防護(hù)的存儲過程,那么除了運行存儲過程應(yīng)用程序所需的內(nèi)存之外,每個用戶連接還有兩個 DB2 代理程序。
            2. 有足夠的 I/O 處理能力。
              • 必須有足夠的磁盤設(shè)備來確保充分的 I/O 并行性,以支持大容量的并發(fā)事務(wù)。對于中等工作負(fù)載而言,每個 CPU 至少應(yīng)當(dāng)有 5 到 10 個磁盤,對于高 I/O OLTP 工作負(fù)載而言,至少要有 20 個磁盤。操作系統(tǒng)(包括調(diào)頁空間)、DB2 日志和 DB2 表空間應(yīng)當(dāng)擁有各自的專用磁盤。應(yīng)當(dāng)有多個磁盤用于 DB2 日志、表和索引。
              • 估計良好性能所需的 I/O 處理能力的正確方式,實際上是制作事務(wù)原型并找出每個事務(wù)需要多少 I/O,以及每秒需要處理多少事務(wù)。然后找出磁盤控制器和磁盤子系統(tǒng)的 I/O 速率以幫助確定需要多少控制器和磁盤。
            3. 有足夠的網(wǎng)絡(luò)帶寬。

              必須有足夠大的網(wǎng)絡(luò)帶寬以支持工作負(fù)載。請確保網(wǎng)絡(luò)或任何中間集線器都不會成為瓶頸。當(dāng)支持遠(yuǎn)程訪問時這一點尤為重要。例如,T1 線路支持 1.544 Mb/s,這僅為 0.193 MB/s,而通常的 10 Mb/s 以太局域網(wǎng)可以支持 1.25 MB/s,吞吐量為 T1 線路的 6 倍。在 UNIX 上使用諸如 netstat 這樣的命令可以監(jiān)控連接上的流量。

            4. 使用 DB2 控制中心(DB2 Control Center)的 DB2 性能配置向?qū)В―B2 Performance Configuration Wizard)來設(shè)置初始的 DB2 數(shù)據(jù)庫管理器(Database Manager)和數(shù)據(jù)庫配置(Database Configuration)參數(shù)。

              這個工具會詢問您一系列有關(guān)工作負(fù)載性質(zhì)的問題,以便確定配置參數(shù)值的起始設(shè)置。您可以修改這些參數(shù)以滿足生產(chǎn)工作負(fù)載的需要。

            5. 適當(dāng)?shù)貫楸砹薪⑺饕?
              • 確保查詢中進(jìn)行連接操作的列都有索引。
              • 如果為 ORDER BY 和 GROUP BY 所涉及的列建立了索引,那么可以提高性能。
              • 也可以將經(jīng)常被訪問的數(shù)據(jù)作為 INCLUDE 子句中的列包含在索引中。
              • 根據(jù)所使用的表和 SQL 語句,使用索引顧問程序(Index Advisor)(也稱為索引向?qū)?(Index Wizard),可以從 DB2 控制中心調(diào)用該程序)來幫助確定使用一組合適的索引。
            6. 確保應(yīng)用程序持有鎖的時間盡可能短。
              • 當(dāng)用戶操作涉及多個交互作用時,每個交互作用應(yīng)當(dāng)提交自己的事務(wù)并且應(yīng)當(dāng)在將活動返回給用戶之前釋放所有鎖。通過盡可能晚地啟動事務(wù)的第一個 SQL 語句(它啟動一個事務(wù))并使事務(wù)的更新(插入、更新和刪除,這些操作要用到互斥鎖)盡可能接近提交階段,從而使事務(wù)的持續(xù)時間盡可能的短。
              • 使用 DB2 注冊表參數(shù) DB2_RR_TO_RS,通過不鎖定插入或更新行的下一個鍵,可以改進(jìn)并發(fā)性。如果對同一組表進(jìn)行操作的任何程序都沒有使用隔離級別 RR(可重復(fù)讀,Repeatable Read),那么就可以使用上述操作。使用 DB2 快照(DB2 Snapshot)監(jiān)控死鎖和鎖等待的數(shù)目。
            7. 使用存儲過程或復(fù)合 SQL 使網(wǎng)絡(luò)成本降到最低。
              • 將用于 SQL 語句的網(wǎng)絡(luò)往返通信次數(shù)降至最低,可以減少網(wǎng)絡(luò)等待時間和上下文切換,這樣可以使應(yīng)用程序持鎖的時間更短。通常,當(dāng) OLTP 事務(wù)有 4 個或 5 個以上語句時應(yīng)當(dāng)使用存儲過程。
              • 另一方面,如果應(yīng)用程序邏輯中涉及了某個復(fù)雜的 CPU 密集型處理,那么將它放在運行于數(shù)據(jù)庫服務(wù)器上的存儲過程中會用光數(shù)據(jù)庫服務(wù)器上的額外 CPU 周期,從而犧牲一些數(shù)據(jù)庫操作。在這種情況下,要么不使用存儲過程,要么在客戶機(jī)端執(zhí)行一部分邏輯,而在存儲過程中執(zhí)行其余的邏輯。
            8. 有效地使用 SQL。
              • 通常,如果一條 SQL 語句能完成任務(wù),那么就不使用多條 SQL 語句。當(dāng)通過在查詢中設(shè)置更多謂詞來提供更詳細(xì)的搜索條件時,優(yōu)化器就有機(jī)會作出更好的選擇。您還應(yīng)該使查詢具有可選擇性,這樣數(shù)據(jù)庫就不會返回您不需要的行和列。例如,使用 SQL 來過濾您想要的行;不用返回所有行,然后要求應(yīng)用程序執(zhí)行過濾操作。
            9. 分析存取方案。
              • 使用可視化說明(Visual Explain)或 db2exfmt 來分析每一條 SQL 語句。請確保使用合適的索引,從而在選擇和連接(join)表時,將必須在內(nèi)部訪存的行數(shù)減到最少。




            回頁首


            更新目錄統(tǒng)計信息

            背景知識

            RUNSTATS 實用程序用于更新系統(tǒng)目錄表中的統(tǒng)計信息,以幫助查詢優(yōu)化過程。如果沒有這些統(tǒng)計信息,數(shù)據(jù)庫管理器可能會做出對 SQL 語句的性能產(chǎn)生不利影響的決定。RUNSTATS 實用程序允許您收集表和/或索引中所包含數(shù)據(jù)的統(tǒng)計信息。使用 RUNSTATS 實用程序收集基于表和索引數(shù)據(jù)的統(tǒng)計信息,以便為下列情形中的存取方案選擇過程提供精確的信息:

            • 當(dāng)向表裝入數(shù)據(jù)并創(chuàng)建了合適的索引時。
            • 當(dāng)用 REORG 實用程序重新組織表時。
            • 當(dāng)存在大量影響表及其索引的更新、刪除和插入操作時。(此處的“大量”可能意味著 10% 到 20% 的表和索引數(shù)據(jù)都受到了影響。)
            • 在綁定性能至關(guān)重要的應(yīng)用程序之前。
            • 當(dāng)您希望將新的和以前的統(tǒng)計信息進(jìn)行比較時。定期進(jìn)行統(tǒng)計使您能夠在早期階段發(fā)現(xiàn)性能問題。
            • 當(dāng)預(yù)取數(shù)量發(fā)生變化時。
            • 當(dāng)您已經(jīng)使用了 REDISTRIBUTE NODEGROUP 實用程序時。

             

            當(dāng)對 SQL 查詢進(jìn)行優(yōu)化時,SQL 編譯器所做出的決定會受到優(yōu)化器的數(shù)據(jù)庫內(nèi)容模型的重大影響。優(yōu)化器使用該數(shù)據(jù)模型來估計可以用于解決某個特定查詢的其它存取路徑的成本。數(shù)據(jù)模型中的關(guān)鍵元素是一組統(tǒng)計信息,該統(tǒng)計信息收集了有關(guān)數(shù)據(jù)庫中所包含的數(shù)據(jù)和系統(tǒng)目錄表中所存儲的數(shù)據(jù)的信息。這包括表、別名(nickname)、索引、列和用戶定義的函數(shù)(UDF)的統(tǒng)計信息。數(shù)據(jù)統(tǒng)計信息中的變化會引起對存取方案的選擇發(fā)生變化,該存取方案作為訪問所期望數(shù)據(jù)的最有效方法。

            下面列舉了一些統(tǒng)計信息,這些統(tǒng)計信息可以幫助給優(yōu)化器定義數(shù)據(jù)模型:

            • 表中的頁數(shù)和非空的頁數(shù)。
            • 從原始頁移到其它(溢出)頁的程度。
            • 表中的行數(shù)。
            • 有關(guān)單個列的統(tǒng)計信息,比如一列中唯一值的數(shù)量。
            • 一個索引的群集程度;即,表中行的物理順序與索引的符合程度。
            • 有關(guān)索引的統(tǒng)計信息,比如索引級別的數(shù)量和每個索引中葉子頁的數(shù)量。
            • 經(jīng)常使用的列值的出現(xiàn)次數(shù)。
            • 列值在列中所有值中的分布狀況。
            • 用戶定義的函數(shù)(UDF)的成本估計。

             

            RUNSTATS 可以幫助您確定對數(shù)據(jù)庫的更改與性能之間的關(guān)系。統(tǒng)計信息顯示出表中的數(shù)據(jù)分布狀況。常規(guī)使用時,RUNSTATS 提供了在一段時期內(nèi)有關(guān)表和索引的數(shù)據(jù),從而隨著時間的流逝,可以確定數(shù)據(jù)模型的性能趨勢。在使用 RUNSTATS 之后需要重新綁定使用靜態(tài) SQL 的應(yīng)用程序,這樣查詢優(yōu)化器就可以選擇新統(tǒng)計信息所給出的最佳存取方案。但是,對于使用動態(tài) SQL 的應(yīng)用程序(比如大多數(shù)供應(yīng)商應(yīng)用程序)而言,沒必要進(jìn)行重新綁定,因為語句的優(yōu)化是根據(jù)統(tǒng)計信息在運行時進(jìn)行的。當(dāng)有關(guān)表的統(tǒng)計信息不準(zhǔn)確時,可能會造成性能問題。最糟的情況是,某個特定的 SQL 語句可能會造成 DB2 使用表掃描而不是使用索引掃描。

            如何更新統(tǒng)計信息

            只有當(dāng)進(jìn)行顯式的請求時,對象的統(tǒng)計信息才會在系統(tǒng)目錄表中被更新。有幾種方法可以更新部分或全部統(tǒng)計信息:

            • 使用 RUNSTATS(運行統(tǒng)計信息,run statistics)實用程序。
            • 使用帶有指定的統(tǒng)計信息收集選項的 LOAD。
            • 對針對一組預(yù)先定義的目錄視圖進(jìn)行操作的 SQL UPDATE 語句進(jìn)行編碼。
            • 使用“reorgchk update statistics”命令。

             

            當(dāng)您不完全知道所有表名或表名實在太多時,進(jìn)行 RUNSTATS 的最簡單方法就是使用“db2 reorgchk update statistics”命令。正確的腳本如下:
            db2 -v connect to DB_NAME
                        db2 -v "select tbname, nleaf, nlevels, stats_time from sysibm.sysindexes"
                        db2 -v reorgchk update statistics on table all
                        db2 -v "select tbname, nleaf, nlevels, stats_time from sysibm.sysindexes"
                        db2 -v terminate
                        

            我們上面所選的示例不需要表名。這一命令對所有表執(zhí)行 RUNSTATS。

            記住在填充數(shù)據(jù)庫之后再運行 RUNSTATS 實用程序。

            如果您知道表名并且想避免對大量表運行 RUNSTATS 實用程序(因為這樣做可能要花很長時間),那么一次對一張表進(jìn)行 RUNSTATS 更為可取。命令如下:
            db2 -v runstats on table
                        TAB_NAME and indexes all
                        

            這個命令將收集該表及其所有索引(基本級別)的統(tǒng)計信息。

            查看是否運行了 RUNSTATS

            要查看是否對數(shù)據(jù)庫執(zhí)行了 RUNSTATS,一種快捷方法便是查詢一些系統(tǒng)目錄表。例如,如上面的腳本所示,可以運行下面這條命令:
            db2 -v "select tbname, nleaf, nlevels, stats_time from sysibm.sysindexes"

            如果還未運行 RUNSTATS,您會看到 nleaf 和 nlevels 列為“-1”且 stats_time 列為“-”。如果已經(jīng)運行了 RUNSTATS,則這些列包含實際的數(shù)字,并且如果運行過 RUNSTATS,則 stats_time 列將包含時間戳記。如果您認(rèn)為 stats_time 中所示時間離現(xiàn)在已有很長一段時間,那就該再次運行 RUNSTATS。





            回頁首


            監(jiān)控和調(diào)優(yōu)數(shù)據(jù)庫配置參數(shù)

            下面這些有關(guān)數(shù)據(jù)庫配置調(diào)優(yōu)的技巧將使您在 OLTP 環(huán)境中取得非常好的性能,同時使您能夠避免顯而易見的“陷阱”。在配置參數(shù)中,數(shù)據(jù)庫管理器配置參數(shù)需要重新啟動數(shù)據(jù)庫管理器,而為了使更改生效,大多數(shù)數(shù)據(jù)庫配置參數(shù)都要求應(yīng)用程序重新連接到數(shù)據(jù)庫。

            這里描述的配置參數(shù)包括:

             





            回頁首


            緩沖池大小

            背景知識

            緩沖池是內(nèi)存中的一塊存儲區(qū)域,用于臨時讀入和更改數(shù)據(jù)庫頁(包含表行或索引項)。緩沖池的用途是為了提高數(shù)據(jù)庫系統(tǒng)的性能。從內(nèi)存訪問數(shù)據(jù)要比從磁盤訪問數(shù)據(jù)快得多。因此,數(shù)據(jù)庫管理器需要從磁盤讀取或?qū)懭氪疟P的次數(shù)越少,性能就越好。對一個或多個緩沖池進(jìn)行配置之所以是調(diào)優(yōu)的最重要方面,是因為連接至數(shù)據(jù)庫的應(yīng)用程序的大多數(shù)數(shù)據(jù)(不包括大對象和長字段數(shù)據(jù))操作都在緩沖池中進(jìn)行。

            缺省情況下,應(yīng)用程序使用緩沖池 IBMDEFAULTBP,它是在創(chuàng)建數(shù)據(jù)庫時創(chuàng)建的。當(dāng) SYSCAT.BUFFERPOOLS 目錄表中該緩沖池的 NPAGES 值為 -1 時,DB2 數(shù)據(jù)庫配置參數(shù) BUFFPAGE 控制著緩沖池的大小。否則會忽略 BUFFPAGE 參數(shù),并且用 NPAGES 參數(shù)所指定的頁數(shù)創(chuàng)建緩沖池。

            建議

            對于僅使用一個緩沖池的應(yīng)用程序,將 NPAGES 更改成 -1,這樣 BUFFPAGE 就可以控制該緩沖池的大小。這使得更新和報告緩沖池大小以及其它 DB2 數(shù)據(jù)庫配置參數(shù)變得更加方便。

            確保可以使用數(shù)據(jù)庫配置中的 BUFFPAGE 參數(shù)來控制緩沖池大小之后,將該參數(shù)設(shè)置成合適的值。根據(jù)數(shù)據(jù)庫的大小和應(yīng)用程序的性質(zhì)將該參數(shù)設(shè)置成一個合理的大值,這種做法很安全。通常,該參數(shù)的缺省值非常小,可能滿足不了要求。請考慮下列情況:

            • 一開始,如果您的機(jī)器上有足夠大的內(nèi)存,請將 BUFFPAGE 設(shè)置成 40000 個頁(160 MB),或者等于機(jī)器總內(nèi)存的 10%。
            • 對于大型 OLTP 數(shù)據(jù)庫,在保持系統(tǒng)穩(wěn)定的同時為緩沖池留出盡可能多的內(nèi)存。一開始,先嘗試使用 1.6 GB 的內(nèi)存,然后嘗試用更多內(nèi)存。

             

            如何更改該參數(shù)

            運行下面這個腳本,以便:

            1. 驗證目錄值
            2. 啟用數(shù)據(jù)庫配置參數(shù) BUFFPAGE
            3. 更新所有數(shù)據(jù)庫的 BUFFPAGE 值。
            4. db2 -v connect to DB_NAME
                              db2 -v select * from syscat.bufferpools
                              db2 -v alter bufferpool IBMDEFAULTBP size -1
                              db2 -v connect reset
                              db2 -v update db cfg for dbname using BUFFPAGE bigger_value
                              db2 -v terminate

             

            研究步驟

            要確定數(shù)據(jù)庫的緩沖池大小是否由 BUFFPAGE 參數(shù)所決定,請運行:
            db2 -v connect to DB_NAME
                        db2 -v SELECT * from SYSCAT.BUFFERPOOLS
                        db2 -v connect reset
                        db2 -v terminate
                        

            檢查結(jié)果。如果每個緩沖池都有一個為“-1”的 NPAGES 值,那么緩沖池大小是由數(shù)據(jù)庫配置中的 BUFFPAGE 參數(shù)控制的。

            要確定緩沖池大小是否足夠大,請在運行應(yīng)用程序時收集數(shù)據(jù)庫和/或緩沖池的快照。類似于下面的腳本為您提供這些所需的信息:
            db2 -v update monitor switches using bufferpool on
                        db2 -v get monitor switches
                        db2 -v reset monitor all
                        
            -- run your application -- db2 -v get snapshot for all databases > snap.out db2 -v get snapshot for dbm >> snap.out db2 -v get snapshot for all bufferpools >> snap.out db2 -v reset monitor all db2 -v terminate

            請確保您在斷開數(shù)據(jù)庫連接之前發(fā)出“db2 -v get snapshot”。當(dāng)最后一個應(yīng)用程序與數(shù)據(jù)庫斷開連接時,該數(shù)據(jù)庫停止運行,同時所有快照統(tǒng)計信息將會丟失。要確保一直存在使數(shù)據(jù)庫處于正常運行狀態(tài)的連接,請使用下列方法之一:

            • 在收集快照的窗口中保持一個單獨的連接。
            • 使用 DB2 ACTIVATE DATABASE 命令。

             

            在數(shù)據(jù)庫快照或緩沖池快照的快照輸出中,查找下列“logical reads”和“physical reads”,這樣就可以計算出緩沖池命中率,它可以幫助您調(diào)優(yōu)緩沖池:
            -- Related lines from a sample of bufferpool snapshots --
                        Buffer pool data logical reads = 702033
                        Buffer pool data physical reads = 0
                        Buffer pool data writes = 414
                        Buffer pool index logical reads = 168255
                        Buffer pool index physical reads = 0
                        

            緩沖池命中率表明數(shù)據(jù)庫管理器不需要從磁盤裝入頁(即該頁已經(jīng)在緩沖池中)就能處理頁請求的時間百分比。緩沖池的命中率越高,使用磁盤 I/O 的頻率就越低。按如下計算緩沖池命中率:
            (1 - ((buffer pool data physical reads + buffer pool index physical reads) /
                        (buffer pool data logical reads + pool index logical reads))
                        ) * 100%
                        

            這個計算考慮了緩沖池高速緩存的所有頁(索引和數(shù)據(jù))。理想情況下,該比率應(yīng)當(dāng)超過 95%,并盡可能接近 100%。要提高緩沖池命中率,請嘗試下面這些方法:

            • 增加緩沖池大小。
            • 考慮分配多個緩沖池,如果可能的話,為每個經(jīng)常被訪問的大表所屬的表空間分配一個緩沖池,為一組小表分配一個緩沖池,然后嘗試一下使用不同大小的緩沖池以查看哪種組合會提供最佳性能。

             

            如果已分配的內(nèi)存不能幫助提高性能,那么請避免給緩沖池分配過多的內(nèi)存。應(yīng)當(dāng)根據(jù)取自測試環(huán)境的快照信息來決定緩沖池的大小。





            回頁首


            日志緩沖區(qū)大?。↙OGBUFSZ)

            背景知識

            LOGBUFSZ 是一個數(shù)據(jù)庫配置參數(shù)。它是用于日志緩沖區(qū)的參數(shù)。它允許您指定數(shù)據(jù)庫共享內(nèi)存的大小以用作在將日志記錄寫到磁盤之前這些記錄的緩沖區(qū)。當(dāng)下列事件之一發(fā)生時會將日志記錄寫到磁盤:

            • 事務(wù)提交。
            • 日志緩沖區(qū)已滿。
            • 其它某個內(nèi)部數(shù)據(jù)庫管理器事件發(fā)生時。

             

            將日志記錄存在緩沖區(qū)將產(chǎn)生更加有效的日志文件 I/O,這是因為這樣一來可以降低將日志記錄寫到磁盤的頻率,同時每次可寫更多的日志記錄。如果對專用的日志磁盤有相當(dāng)多的讀操作,或者希望有較高的磁盤利用率,那么可以增加這個緩沖區(qū)的大小。當(dāng)增加這個參數(shù)的值時,也要考慮 DBHEAP 參數(shù),因為日志緩沖區(qū)使用的空間由 DBHEAP 參數(shù)所控制。

            如何更改該參數(shù)

            我們發(fā)現(xiàn)該參數(shù)的缺省值為 8(4KB 頁),這對于 OLTP 數(shù)據(jù)庫而言通常不夠大。LOGBUFSZ 的最佳值為 128 個或 256 個 4KB 頁。例如,可以使用下面這個命令來更改該參數(shù)值:
            db2 -v update database cfg for DB_NAME using LOGBUFSZ 256
                        db2 -v terminate
                        

            研究步驟

            通過查看下面這個示例中所示各行,使用數(shù)據(jù)庫快照來確定 LOGBUFSZ 參數(shù)的值是否為最佳值:
            Log pages read = 0
                        Log pages written = 12644
                        

            一般而言,“log pages read”和“log pages written”之比應(yīng)當(dāng)盡可能小。理想情況下,“log pages read”的值應(yīng)為 0,而“log pages written”的值應(yīng)很大。當(dāng) log pages read 太多時,意味著需要一個較大的 LOGBUFSZ。





            回頁首


            應(yīng)用程序堆大小(APPHEAPSZ)

            背景知識

            APPHEAPSZ 是一個數(shù)據(jù)庫配置參數(shù),它定義了代表某個特定代理程序或子代理程序的數(shù)據(jù)庫管理器可以使用的私有內(nèi)存頁數(shù)。在為應(yīng)用程序初始化代理程序或子代理程序時分配堆。分配的堆大小是處理給予代理程序或子代理程序的請求所需的最小值。當(dāng)代理程序或子代理程序需要更多的堆空間以處理較大的 SQL 語句時,數(shù)據(jù)庫管理器將按照需要分配內(nèi)存,所分配的內(nèi)存大小最大可達(dá)到該參數(shù)所指定的最大值。

            如何更改該參數(shù)

            下面這條命令可以將缺省值(DB2 EE 為 128 個 4KB 頁,DB2 EEE 為 64 個 4KB 頁)更改成最佳值:
            db2 -v update db cfg for DB_NAME using applheapsz 256
                        db2 -v terminate
                        

            研究步驟

            當(dāng)應(yīng)用程序接收到一個表明應(yīng)用程序堆中存儲空間不夠的錯誤時,應(yīng)該增加 APPHEAPSZ 的值。





            回頁首


            排序堆大?。⊿ORTHEAP)和排序堆閾值(SHEAPTHRES)

            背景知識

            SORTHEAP 是一個數(shù)據(jù)庫配置參數(shù),它定義了私有排序所使用的私有內(nèi)存頁的最大數(shù)目,或共享排序所使用的共享內(nèi)存頁的最大數(shù)目。如果排序是私有排序,那么該參數(shù)影響代理程序私有內(nèi)存。如果排序是共享排序,那么該參數(shù)影響數(shù)據(jù)庫的共享內(nèi)存。每個排序都有單獨的由數(shù)據(jù)庫管理器按需分配的排序堆。在排序堆中對數(shù)據(jù)進(jìn)行排序。如果由優(yōu)化器來指導(dǎo)排序堆大小的分配,那么用優(yōu)化器提供的信息來分配的排序堆的大小要小于由該參數(shù)所指定的排序堆大小。

            SHEAPTHRES 是一個數(shù)據(jù)庫管理器配置參數(shù)。私有和共享排序所使用內(nèi)存的來源不一樣。共享排序內(nèi)存區(qū)的大小是在第一次連接到數(shù)據(jù)庫時根據(jù) SHEAPTHRES 值以靜態(tài)方式預(yù)先確定的。私有排序內(nèi)存區(qū)的大小是不受限制的。對于私有排序和共享排序,應(yīng)用 SHEAPTHRES 參數(shù)的方式不同:

            • 對于私有排序,SHEAPTHRES 是對私有排序在任何給定的時間可以消耗的全部內(nèi)存的實例級“軟”限制。當(dāng)實例的總私有排序內(nèi)存消耗量達(dá)到這一限制時,為其它進(jìn)入的私有排序請求而分配的內(nèi)存會大大減少。
            • 對于共享排序,SHEAPTHRES 是對共享排序在任何給定的時間可以消耗的全部內(nèi)存的數(shù)據(jù)庫級“硬”限制。當(dāng)達(dá)到這一限制時,不允許有其它共享排序內(nèi)存請求,直到總的共享內(nèi)存消耗量回落到 SHEAPTHRES 所指定的限制以下。

             

            使用排序堆的操作示例包括內(nèi)存中表的散列連接和操作。閾值的顯式定義防止數(shù)據(jù)庫管理器將過多數(shù)量的內(nèi)存用于大量排序。

            建議

            • 使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器來跟蹤排序活動。
            • 使用合適的索引使排序堆的使用降到最低。
            • 當(dāng)需要頻繁進(jìn)行大型排序時,增加 SORTHEAP 的值。
            • 如果增加 SORTHEAP,請確定是否還需要調(diào)整數(shù)據(jù)庫管理器配置文件中的 SHEAPTHRES 參數(shù)。
            • 優(yōu)化器用排序堆大小來確定存取路徑。在更改該參數(shù)后請考慮重新綁定應(yīng)用程序(使用 REBIND PACKAGE 命令)。
            • 理想情況下,應(yīng)當(dāng)將排序堆閾值(SHEAPTHRES)參數(shù)合理地設(shè)置為在數(shù)據(jù)庫管理器實例中設(shè)置的 SORTHEAP 參數(shù)最大值的倍數(shù)。該參數(shù)至少應(yīng)當(dāng)是實例中任何數(shù)據(jù)庫所定義的最大 SORTHEAP 的兩倍。

             

            如何更改這些參數(shù)

            要更改 SORTHEAP 和 SHEAPTHRES 的值,請運行以下命令:
            -- SORTHEAP should be changed for individual database --
                        db2 -v update db cfg for DB_NAME using SORTHEAP a_value
                        -- SHEAPTHRES is a database manager parameter --
                        db2 -v update dbm cfg using SHEAPTHRES b_value
                        db2 -v terminate
                        

            研究步驟

            OLTP 應(yīng)用程序不應(yīng)該執(zhí)行大型排序。大型排序在 CPU 和 I/O 資源方面的成本太高了。通常,SORTHEAP 大小的缺省值(256 個 4KB 頁)就足夠了。事實上,對于高并發(fā)性 OLTP,您可能希望降低這個缺省值。當(dāng)需要進(jìn)一步研究時,可以發(fā)出下面這條命令:
            db2 -v update monitor switches using sort on

            然后,讓您的應(yīng)用程序運行一會,然后輸入:
            db2 -v get snapshot for database on DBNAME

            看一下下面這個示例中的輸出:
            Total sort heap allocated = 0
                        Total sorts = 1
                        Total sort time (ms) = 0
                        Sort overflows = 0
                        Active sorts = 0
                        Commit statements attempted = 1
                        Rollback statements attempted = 0
                        Dynamic statements attempted = 4
                        Static statements attempted = 1
                        Binds/precompiles attempted = 0
                        

            根據(jù)該輸出,可以計算每個事務(wù)的排序數(shù)目,并可以計算溢出了可用于排序的內(nèi)存的那部分排序的百分比。
            SortsPerTransaction
                        = (Total Sorts) / (Commit statements attempted + Rollback statements attempted)
                        PercentSortOverflow
                        = (Sort overflows * 100 ) / (Total sorts)
                        

            經(jīng)驗:如果 SortsPerTransaction 大于 5,它可能表明每個事務(wù)的排序太多。如果 PercentSortOverflow 大于 3%,那么可能發(fā)生了嚴(yán)重的、未曾預(yù)料到的大型排序。發(fā)生這種情況時,增加 SORTHEAP 只會隱藏性能問題 - 卻無法修正它。這個問題的正確解決方案是通過添加正確的索引改進(jìn)有問題的 SQL 語句的存取方案。





            回頁首


            代理程序的數(shù)目(MAXAGENTS、NUM_POOLAGENTS 和 NUM_INITAGENTS)

            背景知識

            這些是數(shù)據(jù)庫管理器配置參數(shù)。

            • MAXAGENTS 參數(shù)表明在任何給定時間接受應(yīng)用程序請求的數(shù)據(jù)庫管理器代理程序的最大數(shù)目。MAXAGENTS 的值應(yīng)當(dāng)至少是每個被并發(fā)地訪問的數(shù)據(jù)庫中的 MAXAPPLS(并發(fā)應(yīng)用程序最大數(shù)目)值的總和。如果數(shù)據(jù)庫的數(shù)量大于 NUMDB 參數(shù),那么最安全的方案就是使用 NUMDB 和 MAXAPPLS 最大值的乘積。每個額外的代理程序都需要一些資源開銷,這些開銷在啟動數(shù)據(jù)庫管理器時會分配給代理程序。
            • NUM_POOLAGENTS 參數(shù)是用于評定您希望代理程序池增加到多大的準(zhǔn)則。如果所創(chuàng)建的代理程序多于該參數(shù)值所指明的數(shù)目,那么當(dāng)代理程序執(zhí)行完自己當(dāng)前的請求后將終止運行而不是返回給代理程序池。如果該參數(shù)的值為 0,將按照需要創(chuàng)建代理程序,在代理程序執(zhí)行完自己當(dāng)前的請求后終止運行。

              要避免因在并發(fā)連接許多應(yīng)用程序的 OLTP 環(huán)境中頻繁創(chuàng)建和終止代理程序而產(chǎn)生的成本,請將 NUM_POOLAGENTS 的值增加到接近 MAXAGENTS 值。

            • NUM_INITAGENTS 參數(shù)決定空閑代理程序的初始數(shù)量,這些代理程序是在 DB2START 時在代理程序池中創(chuàng)建的。指定初始代理程序數(shù)目要合適(盡管并非必要條件),這可以縮短“熱身”時間。

             

            建議

            在大多數(shù)情況下,將 MAXAGENTS 和 NUM_POOLAGENTS 的值設(shè)置成略微大于并發(fā)應(yīng)用程序連接的最大預(yù)計數(shù)目。

            讓 NUM_INITAGENTS 保留為缺省值會比較好。

            如何更改該參數(shù)

            為了更改這些參數(shù),請運行以下命令:
            db2 -v update dbm cfg using MAXAGENTS a_value
                        db2 -v update dbm cfg using NUM_POOLAGENTS b_value
                        db2 -v update dbm cfg using NUM_INITAGENTS c_value
                        db2 -v terminate
                        

            研究步驟

            在運行期間的任何時候,您都可以使用下面這個命令來獲取數(shù)據(jù)庫管理器的快照數(shù)據(jù):
            db2 -v get snapshot for database manager

            看一下下列輸出行:
            High water mark for agents registered = 4
                        High water mark for agents waiting for a token = 0
                        Agents registered = 4
                        Agents waiting for a token = 0
                        Idle agents = 0
                        Agents assigned from pool = 5
                        Agents created from empty pool = 4
                        Agents stolen from another application = 0
                        High water mark for coordinating agents = 4
                        Max agents overflow = 0
                        

            如果您發(fā)現(xiàn)“Agents waiting for a token”或“Agents stolen from another application”不等于 0,則可能需要增加 MAXAGENTS 以允許數(shù)據(jù)庫管理器可以使用更多的代理程序。





            回頁首


            鎖(LOCKLIST、MAXLOCKS 和 LOCKTIMEOUT)

            背景知識

            這些與鎖相關(guān)的控制都是數(shù)據(jù)庫配置參數(shù):

            • LOCKLIST 表明分配給鎖列表的存儲容量。每個數(shù)據(jù)庫都有一個鎖列表,鎖列表包含了并發(fā)連接到該數(shù)據(jù)庫的所有應(yīng)用程序所持有的鎖。鎖定是數(shù)據(jù)庫管理器用來控制多個應(yīng)用程序并發(fā)訪問數(shù)據(jù)庫中數(shù)據(jù)的機(jī)制。行和表都可以被鎖定。根據(jù)對象是否還持有其它鎖,每把鎖需要 32 個或 64 個字節(jié)的鎖列表:
              • 需要 64 個字節(jié)來持有某個對象上的鎖,在這個對象上,沒有持有其它鎖。
              • 需要 32 個字節(jié)來記錄某個對象上的鎖,在這個對象上,已經(jīng)持有一個鎖。
            • MAXLOCKS 定義了應(yīng)用程序持有的鎖列表的百分比,在數(shù)據(jù)庫管理器執(zhí)行鎖升級之前必須填充該鎖列表。當(dāng)一個應(yīng)用程序所使用的鎖列表百分比達(dá)到 MAXLOCKS 時,數(shù)據(jù)庫管理器會升級這些鎖,這意味著用表鎖代替行鎖,從而減少列表中鎖的數(shù)量。當(dāng)任何一個應(yīng)用程序所持有的鎖數(shù)量達(dá)到整個鎖列表大小的這個百分比時,對該應(yīng)用程序所持有的鎖進(jìn)行鎖升級。如果鎖列表用完了空間,那么也會發(fā)生鎖升級。數(shù)據(jù)庫管理器通過查看應(yīng)用程序的鎖列表并查找行鎖最多的表,來決定對哪些鎖進(jìn)行升級。如果用一個表鎖替換這些行鎖,將不再會超出 MAXLOCKS 值,那么鎖升級就會停止。否則,鎖升級就會一直進(jìn)行,直到所持有的鎖列表百分比低于 MAXLOCKS。MAXLOCKS 參數(shù)乘以 MAXAPPLS 參數(shù)不能小于 100。

              雖然升級過程本身并不用花很多時間,但是鎖定整個表(相對于鎖定個別行)降低了并發(fā)性,而且數(shù)據(jù)庫的整體性能可能會由于對受鎖升級影響的表的后續(xù)訪問而降低。

              下面是一些控制鎖列表大小的建議:

              • 經(jīng)常進(jìn)行提交以釋放鎖。
              • 當(dāng)執(zhí)行大量更新時,更新之前,在整個事務(wù)期間鎖定整個表(使用 SQL LOCK TABLE 語句)。這只使用了一把鎖從而防止其它事務(wù)妨礙這些更新,但是對于其他用戶它的確減少了數(shù)據(jù)并發(fā)性。
              • 使用 altER TABLE 語句的 LOCKSIZE 參數(shù)控制如何在持久基礎(chǔ)上對某個特定表進(jìn)行鎖定。
              • 查看應(yīng)用程序使用的隔離級別。使用可重復(fù)讀隔離級別在某些情況下可能會導(dǎo)致自動執(zhí)行表鎖定。當(dāng)有可能減少所持有共享鎖的數(shù)量時,可以使用游標(biāo)穩(wěn)定性(Cursor Stability)隔離級別。如果沒有損害應(yīng)用程序完整性需求,那么可以使用未提交的讀隔離級別而不是游標(biāo)穩(wěn)定性隔離級別,以進(jìn)一步減少鎖的數(shù)量。

               

             

            使用下列步驟確定鎖列表所需的頁數(shù):

            1. 計算鎖列表大小的下限:(512 * 32 * MAXAPPLS) / 4096,其中 512 是每個應(yīng)用程序平均所含鎖數(shù)量的估計值,32 是對象(已有一把鎖)上每把鎖所需的字節(jié)數(shù)。
            2. 計算鎖列表大小的上限:(512 * 64 * MAXAPPLS) / 4096,其中 64 是某個對象上第一把鎖所需的字節(jié)數(shù)。
            3. 對于您的數(shù)據(jù),估計可能具有的并發(fā)數(shù),并根據(jù)您的預(yù)計為鎖列表選擇一個初始值,該值位于您計算出的上限和下限之間。

              使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器調(diào)優(yōu) MAXLOCKS 值。

              設(shè)置 MAXLOCKS 時,請考慮鎖列表的大?。↙OCKLIST):

              MAXLOCKS = 100 * (512 鎖/應(yīng)用程序 * 32 字節(jié)/鎖 * 2) / (LOCKLIST * 4096 字節(jié))

              該樣本公式允許任何應(yīng)用程序持有的鎖是平均數(shù)的兩倍。如果只有幾個應(yīng)用程序并發(fā)地運行,則可以增大 MAXLOCKS,因為在這些條件下鎖列表空間中不會有太多爭用。

            4. LOCKTIMEOUT 指定了應(yīng)用程序為獲取鎖所等待的秒數(shù)。這有助于應(yīng)用程序避免全局死鎖。

              • 如果將該參數(shù)設(shè)置成 0,那么應(yīng)用程序?qū)⒉坏却@取鎖。在這種情形中,如果請求時沒有可用的鎖,那么應(yīng)用程序立刻會接收到 -911。
              • 如果將該參數(shù)設(shè)置成 -1,那么將關(guān)閉鎖超時檢測。在這種情形中,應(yīng)用程序?qū)⒌却@取鎖(如果請求時沒有可用的鎖),一直到被授予了鎖或出現(xiàn)死鎖為止。

               

             

            建議

            設(shè)置 LOCKTIMEOUT 以快速檢測由于異常情形而出現(xiàn)的等待,比如事務(wù)被延遲了(可能是由于用戶離開了他們的工作站)。將它設(shè)置得足夠高,這樣有效的鎖請求就不會因為高峰時的工作負(fù)載而超時,在高峰時等待獲取鎖的時間將延長。

            在聯(lián)機(jī)事務(wù)處理(OLTP)環(huán)境中,這個值從 30 秒開始。在只進(jìn)行查詢的環(huán)境中可以從一個更大的值開始。無論哪種情況,都可使用基準(zhǔn)測試技術(shù)來調(diào)優(yōu)該參數(shù)。

            如何更改這些參數(shù)

            要更改鎖參數(shù),請運行以下命令:
            db2 -v update db cfg for DB_NAME using LOCKLIST a_number
                        db2 -v update db cfg for DB_NAME using MAXLOCKS b_number
                        db2 -v update db cfg for DB_NAME using LOCKTIMEOUT c_number
                        db2 -v terminate
                        

            研究步驟

            一旦鎖列表滿了,由于鎖升級生成更多的表鎖和更少的行鎖,因此減少了數(shù)據(jù)庫中共享對象的并發(fā)性,從而降低了性能。另外,應(yīng)用程序間可能會發(fā)生更多死鎖(因為它們都等待數(shù)量有限的表鎖),這會導(dǎo)致事務(wù)被回滾。當(dāng)數(shù)據(jù)庫的鎖請求達(dá)到最大值時,應(yīng)用程序?qū)⒔邮盏街禐?-912 的 SQLCODE。如果鎖升級造成性能方面的問題,則可能需要增大 LOCKLIST 參數(shù)或 MAXLOCKS 參數(shù)的值??梢允褂脭?shù)據(jù)庫系統(tǒng)監(jiān)視器來確定是否發(fā)生鎖升級,跟蹤應(yīng)用程序(連接)遭遇鎖超時的次數(shù),或者數(shù)據(jù)庫檢測到的所有已連接應(yīng)用程序的超時情形。

            1. 首先,運行下面這個命令以打開針對鎖的 DB2 監(jiān)視器:
              db2 -v update monitor switches using lock on
                              db2 -v terminate
                              

            2. 然后收集數(shù)據(jù)庫快照:
              db2 -v get snapshot for database on DB_NAME
                              

            3. 在快照輸出中,檢查下列各項:
              Locks held currently = 0
                              Lock waits = 0
                              Time database waited on locks (ms) = 0
                              Lock list memory in use (Bytes) = 504
                              Deadlocks detected = 0
                              Lock escalations = 0
                              Exclusive lock escalations = 0
                              Agents currently waiting on locks = 0
                              Lock Timeouts = 0
                              Internal rollbacks due to deadlock = 0
                              

             

            如果“Lock list memory in use (Bytes)”超過定義的 LOCKLIST 大小的 50%,那么就增加 LOCKLIST 數(shù)據(jù)庫配置參數(shù)中的 4KB 頁的數(shù)量。鎖升級、鎖超時和死鎖將表明系統(tǒng)或應(yīng)用程序中存在某些潛在問題。鎖定問題通常表明應(yīng)用程序中存在一些相當(dāng)嚴(yán)重的并發(fā)性問題,在增大鎖列表參數(shù)的值之前應(yīng)當(dāng)解決這些問題。





            回頁首


            活動應(yīng)用程序的最大數(shù)目(MAXAPPLS)

            背景知識

            MAXAPPLS 是一個數(shù)據(jù)庫配置參數(shù)。它指定了可以連接到數(shù)據(jù)庫的并發(fā)應(yīng)用程序(本地和遠(yuǎn)程)的最大數(shù)量。由于需要給連接到數(shù)據(jù)庫的每個應(yīng)用程序分配一些私有內(nèi)存,因此允許有更多并發(fā)應(yīng)用程序?qū)⒁馕吨萌ジ鄡?nèi)存。該參數(shù)值必須大于等于已連接應(yīng)用程序的數(shù)量,加上這些相同的應(yīng)用程序中完成兩階段提交或回滾過程中可能并發(fā)存在的數(shù)量的總和。

            建議

            要運行 OLTP 應(yīng)用程序,請確保將 MAXAPPLS 的值設(shè)置正確(足夠大但不能是沒必要的大)以容納最多的并發(fā)用戶/連接。對于那些使用連接池的應(yīng)用程序,我們建議將 MAXAPPLS 的值設(shè)置成比連接池的大小大 1 或 2(這樣做只是為了以防需要調(diào)用命令行連接來同時做一些事情)。

            如何更改該參數(shù)

            要更改 MAXAPPLS 的值,請運行下面的命令:
            db2 -v update db cfg for DB_NAME using MAXAPPLS a_number
                        db2 -v terminate
                        

            研究步驟

            當(dāng)應(yīng)用程序嘗試連接數(shù)據(jù)庫,但是連接到數(shù)據(jù)庫的應(yīng)用程序數(shù)已經(jīng)達(dá)到了 MAXAPPLS 的值時,會向應(yīng)用程序返回下面這個錯誤,表明連接到該數(shù)據(jù)庫的應(yīng)用程序數(shù)已達(dá)到了最大值。

            SQL1040N The maximum number of applications is already connected to the
                        database. SQLSTATE=57030





            回頁首


            異步頁清除程序的數(shù)目(NUM_IOCLEANERS)

            背景知識

            NUM_IOCLEANERS 是一個數(shù)據(jù)庫配置參數(shù),它可以讓您指定數(shù)據(jù)庫的異步頁清除程序的數(shù)目。在數(shù)據(jù)庫代理程序需要緩沖池中的空間之前,這些頁清除程序?qū)⒕彌_池中已更改的頁寫到磁盤。這允許代理程序不必等待已更改頁被寫到磁盤就可以讀取新頁。因此,這會加快應(yīng)用程序事務(wù)的運行。

            如果將該參數(shù)設(shè)置成 0,則不啟動頁清除程序,結(jié)果,數(shù)據(jù)庫代理程序?qū)⒕彌_池中的所有頁寫到磁盤。該參數(shù)會對存儲在多個物理存儲設(shè)備上的單個數(shù)據(jù)庫的性能產(chǎn)生顯著影響,這是因為在這種情況下其中某個設(shè)備極有可能處于空閑狀態(tài)。如果沒有配置頁清除程序,則應(yīng)用程序可能會遇到不時發(fā)生的“日志已滿”情況。

            如果連接到數(shù)據(jù)庫的應(yīng)用程序主要執(zhí)行更新數(shù)據(jù)的事務(wù),那么增加清除程序的數(shù)目會提高性能。增加頁清除程序的數(shù)量還會減少“軟”故障(比如斷電)的恢復(fù)時間,因為磁盤上數(shù)據(jù)庫的內(nèi)容在任何給定時候都是比較新的。

            當(dāng)設(shè)置該參數(shù)的值時要考慮下面這些因素:

            1. 如果有多個事務(wù)針對數(shù)據(jù)庫運行,則將該參數(shù)的值設(shè)置在 1 到該數(shù)據(jù)庫所使用的物理存儲器的數(shù)量之間。有一個建議:至少將該參數(shù)的值設(shè)置成您系統(tǒng)上 CPU 的數(shù)量。
            2. 在具有高更新事務(wù)率的環(huán)境下,可能需要配置較多的頁清除程序。
            3. 在具有大緩沖池的環(huán)境下,也可能需要配置較多的頁清除程序。

             

            如何更改該參數(shù)

            可以用下面的命令來為該參數(shù)設(shè)置一個新值:
            db2 -v update db cfg for DB_NAME using NUM_IOCLEANERS a_number
                        db2 -v terminate
                        

            研究步驟

            使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器,利用有關(guān)從緩沖池進(jìn)行寫操作的快照數(shù)據(jù)(或事件監(jiān)視器)信息來幫助您調(diào)優(yōu)該配置參數(shù)。

            當(dāng)使用快照和收集緩沖池的快照數(shù)據(jù)時,監(jiān)控下列計數(shù)器:

            Buffer pool data writes = 0
                        Asynchronous pool data page writes = 0
                        Buffer pool index writes = 0
                        Asynchronous pool index page writes = 0
                        LSN Gap cleaner triggers 	= 0
                        Dirty page steal cleaner triggers  = 0
                        Dirty page threshold cleaner triggers = 0
                        

            如何決定該減少還是該增加 NUM_IOCLEANERS?

            如果下面這兩個條件成立,則 減少NUM_IOCLEANERS:

            • “Buffer pool data writes”約等于“Asynchronous pool data page writes”。
            • “Buffer pool index writes”約等于“Asynchronous pool index page writes”。

             

            只要下面這兩個條件有一個成立,則 增加NUM_IOCLEANERS:

            • “Buffer pool data writes”遠(yuǎn)遠(yuǎn)大于“Asynchronous pool data page writes”。
            • “Buffer pool index writes”遠(yuǎn)遠(yuǎn)大于“Asynchronous pool index page writes”。

             

            Dirty page steal cleaner triggers 指出調(diào)用頁清除程序的次數(shù),因為在數(shù)據(jù)庫“受損”緩沖區(qū)替換期間需要同步寫操作。為了有更好的響應(yīng)時間,該數(shù)值應(yīng)當(dāng)盡可能低。利用上面所示的計數(shù)器,可以使用下面的公式計算用該元素表示的所有清除程序調(diào)用的百分比:
            Dirty page steal cleaner triggers / (Dirty page steal cleaner triggers +
                        Dirty page threshold cleaner triggers +
                        LSN Gap cleaner triggers)
                        

            如果該比率很高,則它可能表明您所定義的頁清除程序太少了。頁清除程序太少會使故障恢復(fù)時間變長。





            回頁首


            I/O 服務(wù)器的數(shù)目(NUM_IOSERVERS)

            背景知識

            諸如備份和恢復(fù)之類的實用程序使用 I/O 服務(wù)器代表數(shù)據(jù)庫代理程序執(zhí)行預(yù)取 I/O 和異步 I/O。該參數(shù)是一個數(shù)據(jù)庫配置參數(shù),用于指定數(shù)據(jù)庫的 I/O 服務(wù)器的數(shù)目。超過這個數(shù)量的預(yù)取和實用程序 I/O 在任何時候都不能在數(shù)據(jù)庫中運行。在啟動 I/O 操作時,I/O 服務(wù)器處于等待狀態(tài)。由于從數(shù)據(jù)庫代理程序直接調(diào)度非預(yù)取 I/O,因此非預(yù)取 I/O 不受 NUM_IOSERVERS 約束。

            建議

            在 OLTP 環(huán)境中,請使用缺省值。

            如何更改該參數(shù)

            使用下面的命令為 NUM_IOSERVERS 設(shè)置新值:
            db2 -v update db cfg for DB_NAME using NUM_IOSERVERS a_number
                        db2 -v terminate
                        





            回頁首


            編入組中的提交數(shù)目(MINCOMMIT)

            背景知識

            MINCOMMIT 是數(shù)據(jù)庫配置參數(shù),它讓您把將日志記錄寫到磁盤的工作一直延遲到執(zhí)行了最小數(shù)量的提交為止。該延遲可以有助于減少與寫日志記錄相關(guān)的數(shù)據(jù)庫管理器開銷。這意味著當(dāng)您針對數(shù)據(jù)庫運行多個應(yīng)用程序并且在非常短的時間范圍內(nèi)應(yīng)用程序請求大量提交時可以提高性能。只有當(dāng)該參數(shù)值大于 1 并且當(dāng)連接到數(shù)據(jù)庫的應(yīng)用程序數(shù)量大于或等于該參數(shù)值時,才會發(fā)生這個提交分組。當(dāng)執(zhí)行提交分組時,應(yīng)用程序提交請求會被掛起,直到時間過去 1 秒或提交請求的數(shù)量等于該參數(shù)值。

            建議

            MINCOMMIT 的缺省值為 1。如果多個讀/寫應(yīng)用程序通常請求并發(fā)數(shù)據(jù)庫提交,則從缺省值開始遞增該參數(shù)值。這將產(chǎn)生更有效率的日志文件 I/O,因為使用日志文件 I/O 的次數(shù)比較少,而每次使用日志文件 I/O 時所寫的日志記錄比較多。如果您認(rèn)為缺省值不夠大,那么建議您從 3 開始進(jìn)行調(diào)整,在 3 的附近嘗試以查看性能對工作負(fù)載的影響。您還可以對每秒鐘的事務(wù)量進(jìn)行采樣,并調(diào)整該參數(shù)以適應(yīng)每秒鐘的峰值事務(wù)量(或者采用它的某個較大的百分比)。適應(yīng)峰值活動使得在重負(fù)載期間寫日志記錄的開銷減到了最低。

            如果增大 MINCOMMIT,可能還需要增大 LOGBUFSZ 參數(shù)以避免在這些重負(fù)載期間強(qiáng)制將已滿的日志緩沖區(qū)寫入磁盤。在這種情況下,LOGBUFSZ 應(yīng)該等于:
            MINCOMMIT * (log space used, on average, by a transaction)
                        

            下面介紹了如何使用數(shù)據(jù)庫系統(tǒng)監(jiān)視器幫助您調(diào)優(yōu)該參數(shù)的一些方法:

            • 計算每秒鐘的峰值事務(wù)數(shù):

              通過采用典型一天中的監(jiān)視器樣本,可以確定重負(fù)載時期。它的一種實現(xiàn)方法是:

              1. 在測量開始時,發(fā)出下面這個命令:
              db2 -v reset monitor for database db_name

              (這不會使高水位的計數(shù)器復(fù)位。)

              2. 在測量完畢后,發(fā)出下面這個命令:
              db2 -v get snapshot for database on db_name
                              

              3. 使用以下輸出來計算事務(wù)的峰值:
              Last reset timestamp = 06-12-2001 14:51:43.786876
                              Snapshot timestamp = 06-12-2001 14:56:27.787088
                              Commit statements attempted = 1011
                              Rollback statements attempted = 10
                              Log space used by the database (Bytes) = 3990
                              

              totalTransactions等于“commit statements attempted”和“rollback statements attempted”的總和。

              totalElapsedTime(單位為秒)等于“Last reset timestamp”和“Snapshot timestamp”的差。如下計算每秒事務(wù)數(shù):
              NumOfTransPerSecond = totalTransactions / totalElapsedTime
                              

            • 計算每個事務(wù)所使用的日志空間:

              用類似的方式,通過在一段時間內(nèi)對一些事務(wù)使用抽樣技術(shù),可以通過下面這個監(jiān)視器元素: log_space_used(所使用的工作日志空間單元)計算出使用的日志空間的平均值。

              1. 在測量開始時使用下面這個命令將感興趣的數(shù)據(jù)庫的監(jiān)視器復(fù)位:
              db2 -v reset monitor for database db_name.
                              

              2. 在測量完畢后使用下面這個命令獲取快照:
              db2 -v get snapshot for database on db2_name.

              3. 產(chǎn)生如上所示的輸出。

              4. 可以使用下面這個公式計算出每個事務(wù)所使用的日志空間:
              LogSpaceUsedPerTrans = log_space_used / totalTransactions
                              

             

            如何更改該參數(shù)

            使用下面的命令更改 MINCOMMIT 值:
            db2 -v update db cfg for
                        DB_NAME using MINCOMMIT
                        a_number
                        db2 -v terminate
                        





            回頁首


            結(jié)束語

            本文描述了一些 DB2 性能方面的基本要素、調(diào)優(yōu)技巧和技術(shù)以及可能影響 OLTP 性能的一些主要的 DB2 配置參數(shù)。通過按照這里所描述的一些簡單步驟,可以設(shè)置、監(jiān)控和調(diào)優(yōu) DB2 數(shù)據(jù)庫系統(tǒng)。我們希望本文所提供的指導(dǎo)能幫助您實現(xiàn)最優(yōu)化 DB2 應(yīng)用程序性能的目標(biāo)。



            參考資料



            亚洲国产成人精品无码久久久久久综合| 亚洲一区精品伊人久久伊人| 久久偷看各类wc女厕嘘嘘| 欧美日韩精品久久久久| 亚洲精品WWW久久久久久| 久久精品成人欧美大片| 精品久久久久成人码免费动漫| 久久久SS麻豆欧美国产日韩| 久久这里只有精品18| 草草久久久无码国产专区| 中文字幕无码av激情不卡久久| 久久久无码人妻精品无码| 久久九九久精品国产免费直播| 狠狠色丁香久久婷婷综合| 91精品国产综合久久香蕉 | 热99RE久久精品这里都是精品免费 | 狠色狠色狠狠色综合久久| 久久这里都是精品| 精品久久久久久无码中文字幕| 99精品久久精品一区二区| 九九久久精品无码专区| 久久免费线看线看| 久久久噜噜噜www成人网| 久久笫一福利免费导航| 久久www免费人成看国产片| 久久青青草原综合伊人| 韩国免费A级毛片久久| 色妞色综合久久夜夜| 久久久久久久波多野结衣高潮| 久久伊人亚洲AV无码网站| 久久精品国产一区二区| 国产高清美女一级a毛片久久w| 国产亚洲综合久久系列| 久久精品aⅴ无码中文字字幕重口| 97视频久久久| 无码国产69精品久久久久网站| 狠狠色噜噜色狠狠狠综合久久| 伊人色综合久久天天人手人婷 | 久久精品无码专区免费| 狠狠精品久久久无码中文字幕| 亚洲国产成人久久精品影视|