rebind需要查询编目表,获取那里的信息,并重新评估访问计划。rebind只能使用最初bind指定的bind参数而不可改变参数。bind需要.bnd文件,并对.bnd中的对象做很多检查,比如语法检查,表的可用性,是否被授权;然后评估访问计划。bind replace可以允许你带新的bind参数。相同之处,bind和...
显示全部rebind需要查询编目表,获取那里的信息,并重新评估访问计划。rebind只能使用最初bind指定的bind参数而不可改变参数。
bind需要.bnd文件,并对.bnd中的对象做很多检查,比如语法检查,表的可用性,是否被授权;然后评估访问计划。bind replace可以允许你带新的bind参数。
相同之处,bind和rebind都需要确保包依赖对象是否存在,如果对象不存在,那么两个命令执行之后,包都会被标记不可用。如果包标记为invalid,但是还是有程序执行了这个包,那么一个自动的rebind就会执行。如果一个包被标记为invalid,那么当bind replace,用户手工rebind,或者自动rebind执行,而且包依赖的对象仍然不存在,那么包就会进一步被标记为inoperative,未来不会有针对于该包的rebind,而且执行该包肯定会失败。
bind比rebind更费资源,还有可能产生一些新的错误,但是两者执行后,包的执行效率是一样的。
总之,当由于添加索引或者更改了什么表特性,你需要包重新搞一个执行计划,rebind是最佳方案。当你需要改变bind参数的时候,bind(replace)才需要用到。
对于你的问题
1)什么场合会使用原来的包?很简单,只要没有更新执行计划,且该包有效,你就会一直使用该旧的package,比如你给表创建了索引,对表和索引执行了reorg, runstats,但是你没有rebind,你的系统还是使用老的访问计划。
2)数据库升级后是否会使用原来的包。当然,如果你没有db2rind dbname /l xxxx.log,那么即使升级了,你的数据库仍然使用老的包。所以对于数据库大规模升级之后这种场景,db2rbind是必然必须的操作。
不知道你理解了么?
收起