程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 使用DB2look 重新創建優化器訪問計劃(2)

使用DB2look 重新創建優化器訪問計劃(2)

編輯:DB2教程

提示:正如將在下面的 “排序堆” 一節中所看到的,它的工作方式與排序堆的相同。 如果您是一名 DBA,就可能會使用 DB2 SQL Explain&

正如將在下面的 “排序堆” 一節中所看到的,它的工作方式與排序堆的相同。

如果您是一名 DBA,就可能會使用 DB2 SQL Explain Tool(db2exfmt)來獲得對於 SQL 訪問計劃的理解。db2exfmt 工具用於格式化解釋表的內容。如果您在生產中使用 db2exfmt 查看一個訪問計劃的輸出,就會注意到計劃頂部的下列內容。(注意:這些參數通常是由 db2look 輸出中的 -f 和 -fd 選項所選擇的,除了 dbheap 設置之外)。

清單 3. db2exfmt 的示例輸出:

Database Context: 
---------------- 
    Parallelism:      None   
    CPU Speed:       6.523521e-07    
    Comm Speed:       100 
    Buffer Pool size:    50000 
    Sort Heap size:     10000 
    Database Heap size:   5120 
    Lock List size:     1000 
    Maximum Lock List:   10 
    Average Applications:  1 
    Locks Available:    7849 
Package Context: 
--------------- 
    SQL Type:        Dynamic 
    Optimization Level:   5 
    Blocking:        Block All Cursors 
    Isolation Level:    Cursor Stability 
---------------- STATEMENT 1 SECTION 201 ---------------- 
    QUERYNO:        1 
    QUERYTAG:        CLP 
    Statement Type:     Select 
    Updatable:       No 
    Deletable:       No 
    Query Degree:      1

如果您稍稍深入查看 db2exfmt 的輸出,就在訪問計劃之後,您將看到是否具有影響優化器計劃的注冊表設置。

注意:另外,遺憾的是,db2look -f 並非列出了所有相關的注冊表變量。您將需要添加那些遺漏的。一般來說,您測試系統上的注冊表變量設置應與生產系統上的相同,或者盡可能接近。

清單 4. 影響訪問計劃的注冊表設置

1) RETURN: (Return Result) 
    Cumulative Total Cost:     57.6764 
    Cumulative CPU Cost:      191909 
    Cumulative I/O Cost:      2 
    Cumulative Re-Total Cost:    5.37264 
    Cumulative Re-CPU Cost:     134316 
    Cumulative Re-I/O Cost:     0 
    Cumulative First Row Cost:   26.9726 
    Estimated Buffer pool Buffers:  2 
    Arguments: 
    --------- 
    BLDLEVEL: (Build level) 
        DB2 v8.1.0.80 : s041221 
    ENVVAR : (Environment Variable) 
   DB2_ANTIJOIN=yes 
        DB2_INLIST_TO_NLJN = yes 
    STMTHEAP: (Statement heap size) 
        2048

創建數據定義語言(DDL)

下列 "db2look" 命令創建了 DDL 以復制所有數據庫對象,以及配置和統計信息。

db2look -d <dbname> -e -a -m -o db2look.out

核心提示:這裡,我們使用了下列參數: -a:為所有的創建器(creator)生成統計數據。如果指定了該選項,那麼將忽略 -u 選項。 -e:提取復制數據庫所需的&n。

這裡,我們使用了下列參數:

-a:為所有的創建器(creator)生成統計數據。如果指定了該選項,那麼將忽略 -u 選項。

-e:提取復制數據庫所需的 DDL 文件。該選項生成包含了 DDL 語句的腳本。該腳本可以在另一數據庫上運行以重新創建數據庫對象。

-m:以模擬模式運行 db2look 實用程序。該選項生成包含了 SQL UPDATE 語句的腳本。這些 SQL UPDATE 語句捕獲所有的統計數據。該腳本可以在另一數據庫上運行以復制原來的那一個數據庫。當指定 -m 選項時,將忽略 -p、-g 和 -s 選項。

收集數據庫子集的統計數據和 DDL

為了僅僅收集某些表和相關對象的統計數據和 ddl,可使用下列命令:

db2look -d <dbname> -e -a -m -t <table1> <table2>
.. <tableX> -o table.ddl

這裡,我使用了下列附加參數:

-t:為特定的表生成統計數據。可以將表的最大數目指定為 30。

此外,如果您不使用 -a 選項,就可以使用 -z 選項:

-z:模式名。如果同時指定了 -z 和 -a,那麼將忽略 -z。聯邦區域將忽略模式名。

注意:-m 選項極其重要。該選項將從系統表收集所有統計數據。測試中的統計數據必須與生產中的相同,這些統計數據是可以在測試環境中模擬生產環境的關鍵。

db2exfmt 輸出的更多細節

數據庫管理器級的配置參數

注意:使用命令 db2 "get dbm cfg" 查看這些參數,並使用

並行性(Parallelism):

db2 "update dbm cfg using <parameter> <value>"

更新數據庫管理器的配置參數。

該參數表明是啟用分區間並行性(inter-partition parallelism),還是啟用內部分區並行性(intra-partition parallelism)。如果這是具有多個分區的 DPF,那麼您將看到 Inter Partition Parallelism。如果這只是 SMP(啟用 intra_parallel)單個節點環境,那麼您將看到 Intra Partition Parallelism。如果啟用了 intra_parallel,並且是多個分區的環境,您將看到該參數為 Inter and Intra partitions parallelism。最後,如果沒有分區間或分區內並行性,該參數將顯示 NONE。

CPU 速度(cpuspeed):

SQL 優化器使用 CPU 速度(每條指令幾微秒)來評估某些操作的執行成本。

通信速度(comm_bandwidth):

SQL 優化器使用為通信帶寬所指定的值(每秒幾兆字節)來評估在分區數據庫系統中的分區服務器之間執行某些操作的成本。

數據庫級的配置參數

注意:使用命令 db2 "get db cfg for " 來查看這些參數,以及使用 db2 "update db cfg for using ") 來更新數據庫配置參數。

緩沖池大小(buffer pool size):

如果使用 buffpage 作為一個緩沖池的默認值,那麼 db2exfmt 輸出中顯示的緩沖池大小就是由 buffpage 參數決定的,或者基於 syscat.bufferpools 的內容進行計算。所顯示的數目就是分配給數據庫的緩沖池頁面的總數目。例如,假設我們具有下列緩沖池:

表 1. 緩沖池設置

緩沖池名稱大小

IBMDEFAULTBP1000 
BP11000 
BP24000 
BPIND11000 
BPIND21000 
BPLONG1000 
BPTEMP1000 
總數:10,000

db2exfmt 輸出將顯示所有緩沖池中的頁面總數為總的大小。在上面的例子中,就是 10,000。 注意:頁面大小(Pagesize)無關緊要,僅僅是頁面的數目。

如果您無法在測試中分配到與生產中相同數量的緩沖池,那麼可以在 db2look 中使用 -fd 選項來使用 db2fopt 備選命令。

在 MPP 中,優化器為運行查詢的節點使用總的緩沖池信息時,要按每個節點來計算 opt_buffpage。因此,該修改將僅僅應用到運行該工具的那個節點上。

排序堆大小(SORTHEAP)

該參數定義用於私有排序的私有內存頁面的最大數目,或用於共享排序的共享內存頁面的最大數目。

您應將之設置為與生產中相同的值。同樣,通過在 db2look 中使用 -fd 選項,您將注意到:

!db2fopt SAMPLE update opt_sortheap 256;

這將重寫 sortheap 配置參數,優化器也將之用作 sortheap 值。同樣,在運行時真正分配的排序堆(sortheap)實際上將由數據庫配置中的 sortheap 設置來決定。與 opt_buffpage 相同,如果您無法在測試系統上分配與生產系統上相同大小的排序堆(sortheap),那麼可以使用 opt_sortheap。

數據庫堆大小(DBHEAP):

每個數據庫都有一個數據庫堆,數據庫管理器使用它來代表連接到數據庫上的所有應用程序。 它包含表、索引、表空間和緩沖池的控制塊信息。

鎖列表大小(LOCKLIST):

該參數表示分配給鎖列表的存儲器大小。

最大鎖列表(MAXLOCKS):

該參數定義數據庫管理器執行升級之前必須填入的應用程序所占有鎖列表的百分比。

locklist 和 maxlocks 將幫助確定某掃描(索引掃描或表掃描)期間將持有的鎖類型,以及隔離級別。例如,您將在計劃中注意到(比如說)索引掃描操作:

IXSCAN: (Index Scan) 
TABLOCK : (Table Lock intent) 
INTENT SHARE

注意:如果測試系統的 db2exfmt 輸出中的可用鎖(Locks Available)與生產系統不同,就不要進行連接 —— 該差異不影響查詢計劃。

平均應用程序(AVG_APPLS):

SQL 優化器使用該參數來幫助評估在運行時有多少緩沖池可用於所選擇的訪問計劃中(因為連接到數據庫的所有活動應用程序共享緩沖池)。

優化級別(DFT_QUERYOPT):

查詢優化類用於在編譯 SQL 查詢時指導優化器使用不同的優化級別。

查詢深度(DFT_DEGREE):

用於 SQL 語句的分區內部並行程度。如果設置為 ANY,優化器就對聯機的實際 CPU 數目敏感。如果您使用 ANY,那麼就應該將測試和生產系統上的 CPU 數目配置得相同,除非禁用分區內並行(intra_parallel)。

除了以上修改之外,還必須確保其他一些參數都相同。

保留的高頻值數目(NUM_FREQVALUES):

該參數允許您指定“高頻值(most frequent values)”的數目,當在 RUNSTATS 命令上指定 WITH DISTRIBUTION 選項時,將收集該值。

保留的分位數數目(NUM_QUANTILES):

該參數控制在 RUNSTATS 命令上指定 WITH DISTRIBUTION 選項時將收集的分位數(quantile)數目。

測試系統上的上述兩個參數 NUM_FREQVALUES 和 NUM_QUANTILES 必須與生產系統中的相同,以便確保在測試系統上收集與生產中相同數目的頻值數目和分位數值。

SQL 語句堆(4KB)(STMTHEAP):

在 SQL 語句的編譯期間,語句堆(statement heap)用作 SQL 編譯器的工作空間。該參數指定該工作空間的大小。如果測試中的該參數小於生產中的,您就可能會開始看到 SQL0101N 消息,因為缺乏編譯查詢所需要的語句堆空間。如果沒有足夠的語句堆用於動態連接枚舉,您也可能看到 SQL0437W RC=1,下降為貪婪連接枚舉。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved