我最近在我们公司从一名 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”(如果存在这样的话)。
我看到您的信息中心链接指向 LUW 9.7,并且您提到您使用 Java 进行了编程,但我在绑定方面的大部分经验是使用 COBOL 在大型机上使用 DB2。因此,您可能需要稍微调整一下解释(但通常,概念应该相同)。
我相信绑定仅在您编译包含预编译的嵌入式 SQL(静态绑定 SQL)的程序时才相关。例如,如果您使用 JDBC,则不需要运行 BIND。JDBC 驱动程序将
PREPARE
动态声明。当您通过 DB2 预编译器
PRECOMPILE
运行程序时,运行您的程序,如果它发现任何嵌入式 SQL(在 COBOL 中,这些是从EXEC SQL
to开始的语句块END-EXEC.
),它会小心地将 SQL 撕掉,并用调用 COBOL-DB2 接口。在此之后,有两个输出,一个是PRECOMPILE
删除了所有嵌入式 SQL 的 COBOL 源(A
从现在开始),另一个DBRM
是包含所有已删除的 SQL 的输出(B
)。预编译确实会进行一些基本的语法检查,但请注意,检查仅基于程序中的表声明。它不附加到 DB2 来验证这些!
这两个文件是完全独立的,当你运行COBOL程序时,它必须找到同时生成的一个
A
和一个B
。至此,
A
被标准COBOL编译器编译链接成一个load module
并放置在一个加载库中以备后用。B
但是, DBRM还有很多工作要做。这就是BIND
进来的地方。BIND
有点像嵌入式 SQL 代码的编译器,“编译”的输出是package
.为了将 SQL 绑定到一个可执行的“包”中,BIND 进程附加到 DB2 并做一些事情:
在最后一步中,您的所有 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
) 被创建 -> 包被添加到 aBIND PLAN
,这是一组包,允许您创建一个“搜索路径”供您的程序查看。由于这些程序是静态绑定的,如果您的表统计数据发生剧烈变化,那么优化器在绑定时选择的访问路径可能不再是最佳路径,重新绑定将允许它重新评估 SQL 并可能选择一个更好的路径。
编辑(更新评论):如果您使用的是命令行处理器,您可以传入单个绑定包 (
.bnd
) 或绑定文件名列表 (.lst
)。如果你传入一个列表,文件名必须在前面加上一个@
(例如/path/to/@packages.lst
)。在 .lst 文件中,您可以将每个包放在单独的行上,也可以将它们分开+
: