DB2 中的绑定究竟是什么?

Chr*_*ich 8 db2

我最近从 Java 开发人员过渡到我们公司的实际 DBA。可以这么说,我正在学习如何成为一名 DBA(这对我们公司来说实际上是一个新职位)。

我已经看到了几个我们运行命令的脚本DB2 BIND bind_file other_parameters

我对这些做什么感到困惑。我问过我们的其他 DBA,但他们无法以合理的方式向我解释。我已经查看了IBM 信息中心的 BIND 命令,但我也不清楚。

我知道绑定在某种程度上很重要,因为我们应该定期在我们的数据库上运行 REORGS、运行 STATS 和重新 BIND 以帮助提高性能。

由于我仍然是 n00b DBA,我想知道是否有人可以提供“傻瓜绑定是什么?” 解释?

编辑:在以下答案的版本中,我最近遇到了以下 developerworks 文章:“DB2 包:概念、示例和常见问题:了解 DB2 系统和用户应用程序包”。很有帮助。特别是对于系统包,这是我们最常遇到的。


20130905 编辑:DB2 DBA Ember Crooks 的这篇博客条目在绑定及其含义方面非常出色。她还写了一篇关于未找到以及何时为绑定增加 CLIPKG 编号以及这意味着什么的条目。这些文章解释得很好。如果存在这样的东西,基本上就像阅读“DB2 Binding and Packages for Dummies”一样。

bha*_*mby 3

我看到您的信息中心链接转到 LUW 9.7,并且您提到您已经用 Java 进行了编程,但我在绑定方面的大部分经验都是通过 COBOL 在大型机上使用 DB2 进行的。因此,您可能需要稍微调整一下解释(但一般来说,概念应该是相同的)。

我相信只有当您编译包含预编译的嵌入式 SQL(静态绑定 SQL)的程序时,绑定才有意义。例如,如果您使用 JDBC,则不需要运行 BIND。JDBC 驱动程序将PREPARE动态地声明该语句。


当您通过 DB2 预编译器运行程序时,如果它发现任何嵌入的 SQL(在 COBOL 中,这些是从到 的PRECOMPILE语句块),它会小心地删除 SQL,并将其替换为调用 COBOL-DB2 接口。此后,有两个输出:已删除所有嵌入式 SQL 的 COBOL 源(从现在开始),以及包含所有已删除 SQL 的 COBOL 源 ( )。EXEC SQLEND-EXEC.PRECOMPILEADBRMB

预编译确实会进行一些基本的语法检查,但请注意,这些检查仅基于程序中的表声明。它不会附加到 DB2 来验证这些!

这两个文件是完全独立的,当你运行COBOL程序时,它必须找到同时生成的anA和a 。B

至此,A就被用标准COBOL编译器编译链接成一个load module,并放入一个加载库中供以后使用。

B然而, DBRM仍有很多工作要做。这就是BIND发挥作用的地方。 BIND有点像嵌入式 SQL 代码的编译器,“编译”的输出是一个package.

为了将 SQL BIND 到可执行“包”中,BIND 进程附加到 DB2 并执行一些操作:

  • 验证当前 AuthID 是否有权执行绑定。
  • 在 DB2 目录中的数据的帮助下检查 SQL 的语法。
  • 最后,也是最重要的,绑定将优化您的 SQL

在最后一步中,所有 SQL 都通过优化器运行,优化器会考虑所有统计信息以及 DB2 引擎获取数据时可能采用的各种路径。然后,它选择所提出的相关成本最低的路径(对于较新版本的 DB2 [DB2 10 for z/OS],它可能会决定采用“成本较高”但“风险较低”的路径)。一旦选择了路径,它就会被编译并成为一个包,存储在目录中(您可以使用SELECT * FROM SYSIBM.SYSPACKAGE(z/OS)看到当前的所有包)。

最后,还有最后一个部分可以让我们的程序与其包重新组合,即PLAN. 您可以通过执行另一个 BIND ( ) 来创建计划BIND PLAN。计划是程序包的集合,程序可以通过该集合查找具有相同名称的包。使用 COBOL,您可以指定程序应在 JCL 中搜索哪个计划。


简而言之,编译后的代码经过以下步骤来生成可用的BIND PLAN

预编译 -> 创建 DBRM(用 C[++],预编译器将预编译的 SQL 输出到 HFS 文件,可以通过命令行绑定程序发送) -> 对 DBRM 进行优化并设置一组访问路径(创建a package) -> 将包添加到 a 中BIND PLAN,a 是一组包,允许您为程序创建“搜索路径”以进行查找。

由于这些程序是静态绑定的,如果你的表统计数据发生了巨大的变化,那么优化器在绑定时选择的访问路径可能不再是最佳路径,重新绑定将允许它重新评估 SQL,并可能选择一个更好的道路。


编辑(评论更新):如果您使用命令行处理器,则可以传入单个绑定包 (.bnd) 或绑定文件名列表 (.lst)。如果您传入一个列表,则文件名必须在前面加上一个@(例如/path/to/@packages.lst)。在 .lst 文件中,您可以将每个包放在单独的行上,也可以使用以下命令将它们分开+

package1.bnd
package2.bnd
package3.bnd+package4.bnd+package5.bnd
Run Code Online (Sandbox Code Playgroud)