例程统计信息

在首次执行新的 SPL 例程之前,数据库服务器优化 SPL 例程中的 DML 语句。然而,在您调用那个 SPL 例程之前,如果您使用 UPDATE STATISTICS 的 Routine Statistics 语法来更新它的查询执行计划,则可降低出错的风险,其中一些可能引用已通过并发会话的 DDL 操作修改了其模式的表。

优化使得该代码依赖于该例程引用的表的结构。在优化该例程之后,但在执行它之前,如果 DDL 操作修改引用的表的模式,则例程失败并报错。

然而,通常不会发生此失败,如果为引用表的例程启用自动的重新编译,而 ALTER TABLE、CREATE INDEX 或 DROP INDEX 操作已修改了这些表的话。这是 GBase 8s 的缺省行为。要获取更多关于在更改表的模式之后启用或禁用自动的重新优化的信息,请参阅对 SET ENVIRONMENT 语句的 IFX_AUTO_REPREPARE 选项的描述。

然而,当将 AUTO_REPREPARE 配置参数和 IFX_AUTO_REPREPARE 会话环境变量设置为禁用 SPL 例程的重新编译,这些例程引用已修改了其模式的表时,直接地向 SPL 例程引用的表添加或删除索引可导致该例程返回错误 -710。要避免在 DDL 操作之后发生此错误,或要在已通过 DML 操作修改了表分发之后重新优化 SPL 例程,请使用 UPDATE STATISTICS 的 Routine Statistics 段来更新引用该表的任何 SPL 例程的执行计划。
Routine Statistics
元素 描述 限制 语法
routine CREATE FUNCTION 或 CREATE PROCEDURE 语句为 SPL 例程声明了的名称 必须在数据库中存在。在符合 ANSI 的数据库中,如果您不是 owner,则以 owner 限定 routine 标识符

下表说明 Routine Statistics 段的关键字。

关键字
优化哪一执行计划
FUNCTION
带有指定名称(以及带有与 routine 参数列表 相匹配的参数类型,如果提供的话)的 SPL 函数的计划。 如果您指定 FUNCTION 关键字,则 UPDATE STATISTICS 语句失败并报错,除非指定的例程返回一个值或多个值,带有或不带有 WITH RESUME 选项。
PROCEDURE
带有指定的名称(以及与 routine 参数列表 相匹配的参数类型,如果提供的话)的 SPL 过程的计划
ROUTINE
带有指定的名称(以及与例程参数列表相匹配的参数类型,如果提供的话)的 SPL 函数和过程的计划
SPECIFIC
名为 specific name 的 SPL 例程的计划。如果您包括 SPECIFIC 关键字,则紧跟在关键字之后的必须是 FUNCTIONPROCEDUREROUTINE

如果您省略 SPECIFIC 关键字且未包括参数列表,则圆括号符号是可选的。

如果您未紧跟在 FOR FUNCTIONFOR PROCEDUREFOR ROUTINE 关键字之后指定 routine 名称,则为当前数据库中所有 SPL 例程优化执行计划。

数据库服务器保持一个该 SPL 例程显式地引用的表的列表。无论何时修改显式地引用了的表,数据库服务器都在下次执行该过程时重新优化过程。

sysprocplan 系统目录表存储 SPL 例程的执行计划。两个活动可更新 sysprocplan 系统目录表:

如果您更改 SPL 例程引用的表,则可运行 UPDATE STATISTICS 来重新优化引用该表的过程,而不是一直等到下次执行使用该表的 SPL 例程为止。然而,如果 SPL 例程引用的表被删除,则运行 UPDATE STATISTICS 不可防止该 SPL 例程失败并报错。

更新特定的例程的统计信息的示例

下列 UPDATE STATISTICS FOR SPECIFIC 语句指导数据库服务器更新现有的返回一个或多个值的名为 Perform_work 的函数的统计信息:

UPDATE STATISTICS FOR SPECIFIC FUNCTION Perform_work;

对于同一 Perform_work 函数,下列示例的作用与前一示例相同:

UPDATE STATISTICS FOR SPECIFIC ROUTINE Perform_work;

类似地,使用关键字 SPECIFIC PROCEDURESPECIFIC ROUTINE 来更新不返回值的 SPECIFIC 过程的统计信息。

请不要在 SPECIFIC 例程的名称之后包括圆括号或参数列表。由于跟在名为 Perform_work 的函数之后的圆括号,下列语句失败并报错:

UPDATE STATISTICS FOR SPECIFIC ROUTINE Perform_work();

如果以圆括号括起 SPECIFIC 例程、函数或过程的参数,则数据库服务器也发出错误。

1 请参阅 例程参数列表
2 请参阅 专用名