在DB2中绑定到底是什么?


8

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

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

这些功能使我感到困惑。我曾问过我们其他的DBA,但他们无法以合理的方式向我解释。我已经在IBM的Information Center中查看了BIND命令,但是我也不清楚。

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

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

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


20130905编辑:DB2 DBA Ember Crooks的这篇博客文章在绑定及其含义方面非常出色。她还写了一篇关于找不到软件包的条目,以及何时增加绑定的CLIPKG编号以及这的含义。这些文章得到了很好的解释。如果存在这种情况,基本上就像阅读“ DB2傻瓜绑定和软件包”。


1
非常感谢您@Chris进行后续编辑时的指示!
罗伯·威尔斯

Answers:


3

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

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


当您通过DB2预编译器PRECOMPILE运行程序时,在您的程序中运行时,如果发现任何嵌入式SQL(在COBOL中,这些是从EXEC SQL到的语句块END-EXEC.),它将仔细地将SQL提取出来,并用。调用COBOL-DB2接口。此后,有两个输出PRECOMPILE,,COBOL源已删除了所有嵌入式SQL(A从现在开始),以及一个DBRM包含已删除的所有SQL 的COBOL源(B)。

Precompile会进行一些基本的语法检查,但请注意,检查仅基于程序中的表声明。它没有附加到DB2上以进行验证!

这两个文件是完全分开的,当您运行COBOL程序时,它必须找到同时生成的AB

此时,已将A其编译并与标准COBOL编译器链接到中,load module并放置在装入库中,以备后用。

但是,BDBRM 仍有许多工作要做。这就是BIND进来的地方。 BIND有点像嵌入式SQL代码的编译器,“ compile”的输出是package

为了将SQL绑定到可执行的“程序包”中,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并设置一组访问路径(package创建一个)->将该软件包添加到BIND PLAN,这是一组软件包,可让您创建“搜索路径”以供程序浏览。

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


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

package1.bnd
package2.bnd
package3.bnd+package4.bnd+package5.bnd

如果我可以在问题中加上答案,那么.... lst和.bnd文件进行绑定有什么区别?我注意到我们绑定了一些.lst文件(通常是DB2 BIND @ myFile.lst ....)和.bnd文件(相同,但没有@符号)。您也可以将这些添加到答案中吗?
克里斯·奥尔德里奇

1
@ChrisAldrich:答案已更新。基本上,.bnds是绑定文件,而.lsts是绑定文件列表。
bhamby 2012年

另一个问题。我想这仍然让我感到困惑。...我们绑定到的.bnd和.lst文件是IBM随DB2提供的文件,而不是我们编写的任何自定义文件。所以...我想我仍然对什么到底绑定什么仍然不了解。IBM如何知道我们拥有什么?或相反亦然?这些文件的运行绑定到底能做什么?希望这不会令人沮丧。就像我说的那样,真正寻找“傻瓜”式答案的原因对我来说仍然很模糊。
克里斯·奥尔德里奇

1
抱歉,您在休假前就抓住了我!无论如何,要回答您的问题,我猜您正在绑定的是db2ubind.lstand / or db2cli.lst。在服务器上创建新数据库时,将自动创建这些文件,并且这些文件允许各种远程客户端实用程序(CLI / ODBC支持; DB2 CLP;导入/导出实用程序)起作用。看看这个链接
bhamby 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.