我最近从 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 预编译器运行程序时,如果它发现任何嵌入的 SQL(在 COBOL 中,这些是从到 的PRECOMPILE
语句块),它会小心地删除 SQL,并将其替换为调用 COBOL-DB2 接口。此后,有两个输出:已删除所有嵌入式 SQL 的 COBOL 源(从现在开始),以及包含所有已删除 SQL 的 COBOL 源 ( )。EXEC SQL
END-EXEC.
PRECOMPILE
A
DBRM
B
预编译确实会进行一些基本的语法检查,但请注意,这些检查仅基于程序中的表声明。它不会附加到 DB2 来验证这些!
这两个文件是完全独立的,当你运行COBOL程序时,它必须找到同时生成的anA
和a 。B
至此,A
就被用标准COBOL编译器编译链接成一个load module
,并放入一个加载库中供以后使用。
B
然而, DBRM仍有很多工作要做。这就是BIND
发挥作用的地方。 BIND
有点像嵌入式 SQL 代码的编译器,“编译”的输出是一个package
.
为了将 SQL BIND 到可执行“包”中,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
) -> 将包添加到 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)
归档时间: |
|
查看次数: |
33130 次 |
最近记录: |