Src URL:http://www.linuxidc.com/Linux/2014-05/102248.htmlinux
一般咱們知道,DB2的package在統計信息或依賴對象發生變化後須要作下從新綁定,不然DB2優化器會採用效率較差或者錯誤的執行計劃運行該 package,形成執行性能嚴重降低或者SP一直會處於卡死狀態。因此按期對SP進行從新綁定操做,對數據庫總體性能和效率都有較大的提高,可是查一 查,關於DB2的SP從新綁定,提供了三個命令:db2rbind、rebind和bind,不少人都分不清這三者區別,如何使用的問題,因此本文就重點 對着三個命令用法進行分析。數據庫
其實三者都是提供SP從新綁定,不過傳入參數不同,bind須要帶入.bnd的文件,缺陷狀況下,C或嵌入式SQL編寫的SP在 precompile時,都會建立一個以.bnd的結尾的文件,數據庫中使用程序包和應用程序編譯的緣由相同,即就是提升性能和壓縮,在程序包構建過程而 不是執行過程當中,SP中的相關語法語義都獲得分析,而且程序包中存儲的是被解釋效率更高的操做字符組,在服務器管理器調用預編譯生生成的代碼,只須要提供 相應的輸入變量就能夠執行執行,提升了效率。而且預編譯僅僅適用靜態SQL,而不適合如prepare execute和execute immediate 動態SQL。這些動態SQL仍是須要從新進行編譯解釋。db2提供綁定文件描述工具db2bfd工具能夠查看bnd文件。其用法以下:服務器
確切來講package都是用如C等嵌入式語言開發編譯而來,因此在執行綁定操做,咱們一般須要使用bind,由於bind命令須要傳入bnd參數文件名稱,如:工具
就 是將這個程序包和當前數據庫綁定。固然還有其餘參數,對於每一個單獨進行預編譯的源代碼模塊,都將建立一個程序包。若是應用程序有 5 個源文件,其中 3 個須要進行預編譯,那麼將建立 3 個程序包或綁定文件。缺省狀況下,爲每一個程序包指定的名稱與 .bnd 文件所基於的源模塊的名稱相同,但此名稱將被截斷爲 8 個字符。要以顯式方式指定另外一個程序包名,必須在 PREP 命令中使用 PACKAGE USING 選項。程序包的版本由 VERSION 預編譯選項指定,而且缺省爲空字符串。若是這個新建立的程序包的名稱和模式與目標數據庫中當前存在的某個程序包相同,但版本標識有所不一樣,那麼將建立新程序包並保留先前的程序包。可是,若是存在與所綁定程序包的名稱、模式和版本匹配的程序包,那麼該程序包將被刪除並替換爲正在綁定的新程序包。若是綁定時指定了ACTION ADD,那麼將不容許發生這種狀況,而是返回錯誤(SQL0719)。性能
以下都是一些系統默認的綁定文件名稱,其實都是DB2提供的實用程序包的綁定文件,這些文件固然也是採用了C等嵌入式語言開發的SP。但大部分咱們的程序包都是用SQL語言開發的SP,因此這個時候通常都是用rebind.優化
其實工做中咱們最經常使用的仍是rebind命令,db2 rebind package packagename,不過該pakagename是存儲在數據庫中的P打頭的數字名稱,沒法使用直接建立的名稱,因此rebind前須要獲取這個名稱。通常能夠這樣獲取:spa
db2 "select ' db2 rebind package '||rtrim(r.routineschema)||'.'||'P'||substr(char(r.lib_id+10000000),2) from syscat.routines r where r.routinetype = 'P'"htm
但其實不是全部的SP都有lib_id的,因此貌似這個不能綁定像上面的嵌入式程序包。對象
最後再說db2rbind,這個其實最簡單,能夠選擇只綁定無效的程序包或者整庫綁定,於是沒法指定對個別SP進行綁定,固然在數據庫剛恢復或升級 了,就須要從新bind,不然沒法使用新的包,而且還得使用replace參數才能徹底覆蓋以前的包中的信息,爲了保證性能,能夠這樣作,後期的維護中大 部分都不須要整庫進行綁定,當對錶的統計信息進行更新,建立索引,或者reorg操做了,就的須要對依賴的SP作一個rebind,以便於更新 package中存儲的解釋執行信息。索引
默認這三個工具綁定的效果都是同樣的,不一樣的是,各自有各自的參數,尤爲是rebind和bind,綁定參數的使用有的時候直接對性能有很大的提高。
還有,如今DB2提供了一些管理例程工具就像這個專門作SP的從新綁定操做,只須要指定SP例程的類型和名稱,固然也能夠指定像rebind等指定的參數可選項,就能夠對SP進行綁定了,以下:
CALL SYSPROC.REBIND_ROUTINE_PACKAGE ('P','SODS0.DP_INSRT_RT_VALID_SALES_ORD','')