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','')