在语句级别指定访问路径

您可以通过创建语句级访问路径,建议 Db2 在指定范围内对特定SQL语句的所有实例使用特定的访问路径。

准备工作

开始特定程序编程接口信息。满足以下前提条件:
  • 准备管理访问路径。
  • 您拥有以下权限之一:
    • SQLADM
    • 系统管理员
    • SYSCTRL
    • SYSADM
  • 在您的架构下,或者在输入表的单独架构下,存在以下用户表:
    • 用户查询表
    • PLAN_TABLE
    有关在单独架构下使用表的更多信息,请参阅在单独架构下创建输入EXPLAIN表 您可以在 前缀.SDSNSAMP 库的成员DSNTESC和DSNTESH中找到表和相关索引的CREATE语句示例。
  • 在PLAN_TABLE的下列列上创建索引:
    • QUERYNO
    • APPLNAME
    • PROGNAME
    • 版本
    • COLLID
    • OPTHINT

    SDSNSAMP库的成员DSNTESC中包含创建索引的示例语句。

  • 包含语句的包是由BIND PACKAGE语句创建的。 对于由其他语句创建的包中的语句,不支持影响访问路径的语句级方法,例如CREATE FUNCTION、CREATE TRIGGER和CREATE PROCEDURE语句。

关于本任务

语句级访问路径使用语句文本的匹配,将指定的访问路径应用于以下范围之一中语句的所有实例:

  • 系统范围
  • 从任何版本的特定收藏和套餐中
  • 从特定版本的收藏和套餐中
提示: IBM® Db2 Query Workload Tuner for z/OS®IBM Db2 Administration Foundation for z/OS 提供增强的查询调整功能,可以帮助您完成这项任务。

过程

创建引人注目的访问路径:

  1. 将行插入到DSN_USERQUERY_TABLE表中。
    1. 在以下列中插入值,以指定SQL语句和应用访问路径的上下文:
      QUERYNO
      输入与现有PLAN_TABLE行中QUERYNO列的值相关的值,这些行描述了您要强制执行的访问路径。
      SCHEMA
      如果SQL语句包含可能解析为不同默认架构的不合格对象名称,请插入标识不合格数据库对象的架构名称。 如果语句中包含无限制的对象名称,因为该语句可能适用于不同时间下的不同模式,则必须为每个可能的模式值创建单独的提示或覆盖。 如果语句中仅包含完全限定的对象名称,则不需要SCHEMA值。 不过,您仍然可以插入一个 SCHEMA 值,以帮助您识别提示与特定 schema 有关。
      QUERY_TEXT
      插入您想要影响访问路径的声明文本。

      您提供的文本必须与 Db2 在绑定静态SQL语句和准备动态SQL语句时使用的语句文本相匹配。 有关如何成功进行文本匹配的更多信息,请参阅为语句级匹配填充查询文本

      提示范围
      插入一个值,以指定语句匹配的上下文。
      0
      系统范围。 Db2 仅使用SQL语句的文本和SCHEMA列的值(当该列包含值时)来确定语句是否匹配。
      1
      套餐级别。 Db2 使用“系列”、“套装”和“版本”列的值来确定语句是否匹配。
      集合
      输入包裹的序列号。 仅当HINT_SCOPE的值为1时,才需要该值。

      当 HINT_SCOPE 的值为 0 时,该值是可选的;当指定了值时,如果在 SYSIBM.SYSPACKAGE 目录表中找不到匹配的值,则 Db2 会在绑定查询时发出错误消息。 当 HINT_SCOPE 为 0 时,请同时指定 COLLECTION 和 PACKAGE,或者将这两个字段留空。

      对于静态 SQL 语句和使用 DYNAMICRULES(BIND) 选项的动态 SQL 语句,您可能需要指定此列的值,以便 Db2 可以从 SYSIBM.SYSPACKSTMT 目录表中检索正确的应用程序默认值。

      PACKAGE
      输入软件包名称。 仅当HINT_SCOPE的值为1时,才需要该值。

      当 HINT_SCOPE 的值为 0 时,该值是可选的;当指定了值时,如果在 SYSIBM.SYSPACKAGE 目录表中找不到匹配的值,则 Db2 会在绑定查询时发出错误消息。 当 HINT_SCOPE 为 0 时,请同时指定 COLLECTION 和 PACKAGE,或者将这两个字段留空。

      对于静态 SQL 语句和使用 DYNAMICRULES(BIND) 选项的动态 SQL 语句,您可能需要指定此列的值,以便 Db2 可以从 SYSIBM.SYSPACKSTMT 目录表中检索正确的应用程序默认值。

      特定于包的范围主要用于支持语句级提示的暂存、验证和测试,然后再将其部署到全系统范围。

      版本
      插入软件包的版本标识符或“*”。 仅当HINT_SCOPE的值为1时,才需要填写此列中的值。 当您在版本列中指定“*”时, Db2 不需要与版本列进行匹配。

      当HINT_SCOPE的值为0时,该值是可选的。 当指定值时,如果在 SYSIBM.SYSPACKAGE 目录表中找不到匹配的值, Db2 会在绑定查询时发出错误消息。

      对于静态 SQL 语句和使用 DYNAMICRULES(BIND) 选项的动态 SQL 语句,您可能需要指定此列的值,以便 Db2 可以从 SYSIBM.SYSPACKSTMT 目录表中检索正确的应用程序默认值。

      selectvty_override
      指定值“N”表示未指定选择性覆盖。 同一语句中,语句级访问路径和选择性覆盖不能共存。
      访问路径提示
      指定一个值“Y”表示已指定访问路径。
      选项覆盖
      指定值“Y”表示已指定语句级优化参数。
      重要提示 :为了兼容性,DSN_USERQUERY_TABLE的旧格式(不包含SELECTVTY_OVERRIDE、ACCESSPATH_HINT和OPTION_OVERRIDE列)也受支持。 然而,建议使用最新的 DSN_USERQUERY_TABLE 格式,并在每个列中指定值。 通过指定这些值,您可以简化仅使用预期方法影响访问路径的过程。
      例如,您可以执行以下任一语句来填充DSN_USERQUERY_TABLE。
      • 对于静态 SQL 语句,您可以从 SYSIBM.SYSPACKSTMT 目录表中检索值,并通过执行如下 INSERT 语句来插入这些值:
        INSERT INTO DSN_USERQUERY_TABLE 
        ( QUERYNO, SCHEMA, HINT_SCOPE, 
        QUERY_TEXT,
        USERFILTER, OTHER_OPTIONS,
          COLLECTION, PACKAGE, VERSION, 
        REOPT, STARJOIN, 
        MAX_PAR_DEGREE, DEF_CURR_DEGREE, 
        SJTABLES, OTHER_PARMS, 
        SELECTVTY_OVERRIDE, ACCESSPATH_HINT, 
        OPTION_OVERRIDE 
        )   
        SELECT 1111111, 'MYSCHEMA_1', 1, 
        STATEMENT, 
        '','',
        COLLID, NAME, VERSION, 
        '', '', 
        -1, '', -1, '',
        'N', 'Y', 'N' 
        FROM SYSIBM.SYSPACKSTMT
        WHERE COLLID = 'MYCOLLID_1'
        AND NAME = 'MYPACKAGE_1'
        AND VERSION = 'MYVERSION_1'
        AND STMTNO = 12;

        验证通过后,结果将指定 Db2 使用PLAN_TABLE行描述的访问路径,该行包含QUERYNO值为1111111的指定语句实例,这些语句是在指定的包版本下发出的。 HINT_SCOPE的1值表示该提示仅适用于由指定包发出的语句实例。

      • 如果 SYSIBM.SYSPACKSTMT 目录表中不存在语句文本和其他信息,您可以发出INSERT语句,明确指定值。
  2. 为SQL语句填充PLAN_TABLE。 您可以手动插入一行或多行或发出EXPLAIN语句来填充此表。
  3. 发出BIND QUERY命令。
    您必须忽略LOOKUP选项或指定LOOKUP(NO)。
    如果您在专用架构下创建了输入表,请指定EXPLAININPUTSCHEMA绑定选项和架构名称。
    Db2 从每个 DSN_USERQUERY_TABLE 行和相关输入表中获取输入,并将数据插入到以下目录表中:
    • SYSIBM.SYSQUERY
    • SYSIBM.SYSQUERYPLAN

    QUERYID列将这些表中的行关联起来。

    结束特定程序编程接口信息。

结果

当您重新绑定包含静态 SQL 语句的程序包时,静态 SQL 语句的目录表行将被验证并应用。 动态 SQL 语句的目录表行在语句准备时进行验证和强制执行。

如果 Db2 使用了您指定的所有访问路径,则从EXPLAIN语句的PREPARE和SQL语句的PREPARE返回SQLCODE +394,这些语句使用了指定的访问路径。 如果指定的访问路径无效,或者发现任何重复,请发送电子邮件至 Db2 ,并附上SQLCODE +395。 通过设置SUPPRESS_HINT_SQLCODE_DYN子系统参数的值,可以禁止动态SQL语句中的SQLCODES +394和+395。

后续操作

请考虑采取以下措施:

  1. 确认已创建相应的目录表行:
    1. 将一行插入到DSN_USERQUERY_TABLE表中,其中QUERY_TEXT和SCHEMA列包含值。
    2. 发出以下命令:
      BIND QUERY LOOKUP(YES)
      Db2 发出以下消息,以指示目录表是否包含与 DSN_USERQUERY_TABLE 行相对应的有效行。
      • DSNT280I 在目录表中与每行DSN_USERQUERY_TABLE匹配的行。
      • DSNT281I 在目录表中不匹配的每行DSN_USERQUERY_TABLE的行信息。
      • 如果在目录表中找到匹配的行,则发送一条消息,或者 DSNT290I 如果在目录表中找到匹配的行,则发送一条消息;如果 DSNT291I 如果没有找到匹配的行,则发送一条消息。
      Db2 还更新了DSN_USERQUERY_TABLE表中QUERYID列的值,使其与 目录表中匹配行的值相匹配。 SYSIBM.SYSQUERY
  2. 删除DSN_USERQUERY_TABLE行,以防止在您发出后续BIND QUERY命令时替换现有目录表行。 当您发出BIND_QUERY命令时,会为DSN_USERQUERY_TABLE中的每一行创建或替换目录表行。 如果旧行保留在DSN_USERQUERY_TABLE中,而您再次发出BIND_QUERY命令,则其他输入表中的数据更改可能会产生意想不到的后果。