[转]DB2 package的bind、rebind和db2rbind
Src URL:http://www.linuxidc.com/Linux/2014-05/102248.htm
通常我们知道,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前需要获取这个名称。一般可以这样获取:
db2 "select ' db2 rebind package '||rtrim(r.routineschema)||'.'||'P'||substr(char(r.lib_id+10000000),2) from syscat.routines r where r.routinetype = 'P'"
但其实不是所有的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','')