影响访问路径的方法之间的相互作用

影响访问路径选择和PLAN_TABLE优化提示的语句级方法可以组合用于相同的语句。 但是,存在某些限制。

影响匹配语句访问路径的表行可以与应用于相同语句的PLAN_TABLE优化提示共存。 Db2 当您在绑定或重新绑定时指定访问路径重用时,也会在同一目录表中创建和使用行。

影响访问路径的不同方法可以共存。 然而, Db2 只使用一种方法。 当同一语句可能适用多种方法时,仅使用第一种适用方法,优先顺序如下:
  1. PLAN_TABLE 访问路径提示
  2. 特定版本、集合和软件包的声明级访问路径或参数。
  3. 特定集合和包的声明级访问路径或参数。
  4. 声明级访问路径或参数,具有系统范围。
  5. Db2 在内部创建的声明级访问路径,用于访问路径的重复使用
  6. 语句级谓词选择优先于

当发出BIND QUERY命令时,同一应用程序上下文(架构和包)中同一SQL语句的语句级访问路径不能与其他方法(例如优化参数或选择性覆盖)共存。 以下 DSN_USERQUERY_TABLE 列控制着在您发出 BIND QUERY 命令时创建的提示类型。

  • 选择性_覆盖
  • 访问路径提示
  • 选项覆盖

当发出 BIND QUERY 命令时,如果 ACCESSPATH_HINT 或 OPTION_OVERRIDE 列中的任意一列为空,则这两列都必须为空。 为了兼容性,空白值是支持的。 但是,最好不要使用空白值。 当这些值是空值时, Db2 使用来自多个输入表的数据来确定如何填充目录表。 有时结果难以预测,尤其是使用EXPLAIN输出表时。 当为这些列指定值时,SELECTIVITY_OVERRIDE和OPTION_OVERRIDE列可以同时包含“Y”值。 然而,当这两个值中的任何一个为“Y”时,ACCESSPATH_HINT必须为“N”。 同样,当ACCESSPATH_HINT设置为“Y”时,其他两列必须同时设置为“N”。 下表总结了有效的组合。

表 1. DSN_USER_QUERY_TABLE中提示类型列的有效组合摘要
组合结果
访问路径_
提示栏
选项_
覆盖列
选择性_
覆盖列
访问路径已指定 “Y” 'N' 'N'
访问路径已指定 “Y” 空白 'N'
选项和选择行已指定 'N' “Y” “Y”
仅指定了选项覆盖。 'N' “Y” 'N'
仅指定选择性覆盖。 'N' 'N' “Y”
可以根据其他列的值指定选项覆盖 'N' 空白 “Y”或“N”
根据其他列和PLAN_TABLE中的值,可以指定访问路径和优化参数。

访问路径优先于其他方法。 未指定选择性覆盖。 这种组合是为了兼容性。 不过,在创建新提示或覆盖时,最好指定每个列的值。

空白 空白 'N'
您不能在语句级访问路径中指定与其他语句级方法结合使用,以影响同一应用程序上下文中的同一 SQL 语句的访问路径。 但是,您可以在同一应用程序上下文中覆盖谓词选择,并为同一语句指定语句级优化参数。
  • 优先于谓词的选择性。
  • 指定语句级优化参数。
  • 指定语句级别的访问路径。
当您发出绑定查询命令时, Db2 会替换同一应用程序上下文中适用于同一语句的现有 SYSIBM.SYSQUERY 目录表行。

例如,假设 SYSIBM.SYSQUERY 目录表已经包含一行,指定了 SQL文本语句和 S1 模式:

STMTTEXT  SCHEMA  PACKAGE
SQL-text  S1        

假设当DSN_USERQUERY表包含指定的行时,您按顺序发出BIND QUERY命令:

  1. 仅指定 SQL文本的行Db2 替换现有行。 特定于模式的目录表行被全局行替换,用于匹配语句。 SYSIBM.SYSQUERY 表格中仍然只有一行。
    STMTTEXT  SCHEMA  PACKAGE
    SQL-text              
  2. 一行指定 SQL文本和 S2 模式。 全局目录表中的行被新的特定架构行取代。 SYSIBM.SYSQUERY 表格现在只有一行:
    STMTTEXT  SCHEMA  PACKAGE
    SQL-text  S2          
  3. 一行指定 SQL文本和 S1 模式。 新的一行被插入,不会替换现有的一行。 SYSIBM.SYSQUERY 表格现在有两行:
    STMTTEXT  SCHEMA  PACKAGE
    SQL-text  S2          
    SQL-text  S1          
  4. 一行代码,用于指定 SQL文本、 S1 架构和 P1 包。 SYSIBM.SYSQUERY 表格现在有三行:
  5. 一行代码,用于指定 SQL文本、 S1 架构和 P2 包。 Db2 插入新的一行。 SYSIBM.SYSQUERY 表格现在包含四行:
    STMTTEXT  SCHEMA  PACKAGE
    SQL-text  S2        
    SQL-text  S1        
    SQL-text  S1      P1
    SQL-text  S1      P2