REBIND 命令

REBIND 命令

REBIND 命令允许用户在不需要绑定文件的情况下重新创建数据库中存储的包。

绑定文件是存储存储过程、函数或其他 SQL 语句所需信息的文件。这些信息包括语句的语法、数据类型、参数等。绑定文件的格式由数据库厂商定义,通常是文本文件或二进制文件。

是将多个 SQL 语句组合在一起的逻辑单元。包可以包含存储过程、函数、游标等。

存储过程是存储在数据库中的可重复执行的 SQL 语句集合。存储过程可以用于实现复杂的业务逻辑,并提高数据库应用程序的性能。

具体来说,REBIND 命令的工作原理如下:

  1. 数据库会根据包的名称查找绑定文件。
  2. 如果找到了绑定文件,则数据库会使用绑定文件中的信息来重新创建包。
  3. 如果没有找到绑定文件,则数据库会使用包中存储的 SQL 语句来重新创建包。

REBIND 命令可以用于以下场景:

  • 数据库升级后,需要重新创建包。

  • 包中的数据类型或参数发生了更改,需要重新创建包。

  • 包的性能需要提高,需要重新创建包。

绑定文件是预编译的结果。预编译是将 SQL 语句转换为机器代码的过程。通过预编译,可以提高 SQL 语句的执行性能。

具体来说,预编译可以实现以下优化:

  • 消除语法检查和解析的开销。
  • 生成更高效的执行计划。
  • 减少对数据库的访问次数。

因此,对于需要频繁执行的 SQL 语句,建议使用预编译。

**在 REBIND 命令中,如果指定了绑定文件,则数据库会使用绑定文件中的信息来重新创建包。**这意味着,重新创建包时,数据库会使用绑定文件中的信息来生成包的执行计划。这样可以保证重新创建的包与原始包具有相同的性能。

**如果没有指定绑定文件,则数据库会使用包中存储的 SQL 语句来重新创建包。**这种情况下,数据库会重新生成包的执行计划。如果包中存储的 SQL 语句与原始包中的 SQL 语句相同,则重新生成的执行计划与原始包的执行计划相同。如果包中存储的 SQL 语句与原始包中的 SQL 语句不同,则重新生成的执行计划可能与原始包的执行计划不同。

授权

需要以下权限之一:

  • DBADM 权限
  • 目标模式的 ALTERIN 权限或 SCHEMAADM 权限
  • 包的 BIND 权限

记录在 SYSCAT.PACKAGES 系统目录表的 BOUNDBY 列中的授权 ID 是重新绑定过程中使用的绑定者授权 ID,也是包中表引用的默认模式的授权 ID。这个默认限定符可能与执行重新绑定请求的授权 ID 不同。REBIND 将使用包创建时指定的相同绑定选项。

所需连接

数据库。如果不存在数据库连接,并且启用了隐式连接,则与默认数据库建立连接。

命令语法

在这里插入图片描述

命令参数

PACKAGE 包名

指定要重新绑定的包的合格名称或非合格名称。

VERSION 版本名

要重新绑定的特定包版本。如果未指定版本,则取为空字符串 “”。

APREUSE

指定是否重用静态 SQL 访问计划。启用此选项后,查询编译器将在现有包的重新绑定期间以及将来的隐式和显式重新绑定期间,尝试重用静态 SQL 语句的访问计划。默认值是在以前调用 BIND 或 REBIND 命令或 ALTER PACKAGE 语句时使用的值。要确定该值,请查询 SYSCAT.PACKAGES 中的包的 APREUSE 列。

YES

查询编译器将尝试重用包中语句的访问计划。

NO

查询编译器不会尝试重用包中语句的访问计划。

RESOLVE

指定是否使用保守的绑定语义来执行对包的重新绑定。这会影响在包中的静态 DML 语句的解析期间是否考虑使用 SQL 路径来解析的新对象。DRDA 不支持此选项。有效值为:

ANY

在使用 SQL 路径对象解析的任何对象的引用中,将考虑 SQL 路径中的所有可能匹配项。不使用保守的绑定语义。这是默认值。

CONSERVATIVE

在使用 SQL 路径对象解析的任何对象的引用中,只考虑在上一次显式绑定时间戳之前定义的 SQL 路径中的对象。使用保守的绑定语义。不能对失效的包指定此选项。

REOPT

指定是否使用主机变量、参数标记、全局变量和特殊寄存器的值来优化访问路径。

NONE

对于包含主机变量、参数标记、全局变量或特殊寄存器的 SQL 语句,将不会使用这些变量的实际值来优化访问路径。将改为使用这些变量的默认估计值,缓存并后续使用该计划。这是默认行为。

ONCE

对于给定的 SQL 语句,将在第一次执行查询时使用主机变量、参数标记、全局变量或特殊寄存器的实际值来优化访问路径。缓存并后续使用该计划。

ALWAYS

对于给定的 SQL 语句,将始终在每次执行时编译并使用主机变量、参数标记、全局变量或特殊寄存器的已知值来重新优化访问路径。

FUNCPATH

指定在静态 SQL 中解析用户定义的不同类型和函数时要使用的函数路径。默认值为在包的上一次 BIND 或 REBIND 命令调用中使用的值。要确定该值,请在 SYSCAT.PACKAGES 视图中查询包的 FUNC_PATH 列。

模式名

一个 SQL 标识符,可以是普通的或限定的,用于标识在应用服务器上存在的模式。在预编译或绑定时间不会验证模式是否存在。不能在函数路径中多次使用同一模式。不能为函数路径指定 SYSPUBLIC 模式名称。可以指定的模式数量受到生成的函数路径的长度限制,该长度不能超过 2048 个字节。不必指定 SYSIBM 模式:如果在函数路径中不包括它,则假定 SYSIBM 模式是第一个模式。

使用说明

REBIND 在成功重新绑定后不会自动提交事务。用户必须显式提交事务。这可以启用“假设分析”,其中用户更新某些统计信息,然后尝试重新绑定包以查看更改情况。它还允许在一个工作单元中进行多次重新绑定。

如果启用了自动提交,REBIND 命令将提交事务。

该命令:

  • 提供了快速重新创建包的方法。这样可以在不需要原始绑定文件的情况下利用系统中的更改。例如,如果某 SQL 语句可能会受益于新创建的索引,则可以使用 REBIND 命令重新创建包。在 RUNSTATS 执行后也可以使用 REBIND 来重新创建包,从而利用新的统计信息。

  • 提供了重新创建失效包的方法。必须通过调用绑定实用程序或重新绑定实用程序来显式重新绑定失效的包。如果包所依赖的函数实例被删除,则会将包标记为失效(SYSCAT.PACKAGES 系统目录表的 VALID 列将设置为 X)。

  • 为用户提供了对失效包重新绑定的控制。当执行失效包时,数据库管理器会自动或隐式重新绑定它们。这是在一个自治事务中完成的,如果重新绑定成功,该事务将被提交,并使所有用户可以立即访问该包。失效包的隐式重新绑定可能会导致执行该失效包的第一个 SQL 请求显著延迟。

如果存在同名和同创建者的多个包版本,则一次只能重新绑定一个版本。如果在 VERSION 选项中未指定,则包版本默认为 “”。即使只有一个与指定名称匹配的包,也不会重新绑定它,除非其版本与指定的版本匹配或与默认版本匹配。

根据情况选择使用 BIND 还是 REBIND 显式重新绑定包。建议在情况不明确要求使用 BIND 的情况下尽可能使用 REBIND,因为 REBIND 的性能明显优于 BIND。但是,必须在以下情况下使用 BIND:

  • 程序发生了修改(例如,添加或删除了 SQL 语句,或者包与程序的可执行文件不匹配)。

  • 想要作为重新绑定过程的一部分修改任何 REBIND 命令不支持的绑定选项。REBIND 命令不支持所有绑定选项。例如,如果要在绑定过程中授予对包的权限,则必须使用 BIND 命令,因为它具有 GRANT 选项。

  • 包当前不在数据库中。

  • 需要检测到所有绑定错误。REBIND 只返回它检测到的第一个错误,而 BIND 命令会返回绑定过程中出现的前 100 个错误。

Db2 Connect 支持 REBIND。

如果在另一个用户正在使用的包上执行 REBIND,则重新绑定将在其他用户的逻辑工作单元结束之前不会发生,因为在重新绑定期间会在 SYSCAT.PACKAGES 系统目录表中的包记录上持有排他锁。

执行 REBIND 时,数据库管理器将从 SYSCAT.STATEMENTS 系统目录表中存储的 SQL 语句重新创建包。

如果 REBIND 遇到错误,将停止处理并返回错误消息。

将对使用 EXPLSNAP 绑定选项设置为 YES 或 ALL(在 SYSCAT.PACKAGES 目录表中包的条目的 EXPLAIN_SNAPSHOT 列中指示)或使用 EXPLAIN 绑定选项设置为 YES 或 ALL(在 SYSCAT.PACKAGES 目录表中包条目的 EXPLAIN_MODE 列中指示)创建的包重新解释。使用的是 REBIND 请求者的解释表,而不是原始绑定者的解释表。

如果发现某 SQL 语句存在错误并且指定了 BIND 选项 SQLERROR CONTINUE,则语句将被标记为无效,即使问题已经得到校正。REBIND 不会更改无效语句的状态。在使用 VALIDATE RUN 绑定的包中,语句可以在 REBIND 期间根据对象存在或权限问题是否存在而在静态绑定与增量绑定之间切换。

使用 REOPT ONCE 或 ALWAYS 对包重新绑定可能会改变静态语句和动态语句的编译和性能。

如果未指定 REOPT,REBIND 将保留 PRECOMPILE 或 BIND 时间使用的现有 REOPT 值。

每个编译后的 SQL 对象都有一个依赖它的包。可以通过使用 REBIND_ROUTINE_PACKAGE 过程随时重新绑定依赖包。显式重新绑定依赖包不会重新验证无效对象。使用自动重新验证或使用 ADMIN_REVALIDATE_DB_OBJECTS 过程显式重新验证无效对象。对象重新验证会自动重新绑定依赖包。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值