影响访问路径的方法之间的相互作用
影响访问路径选择和PLAN_TABLE优化提示的语句级方法可以组合用于相同的语句。 但是,存在某些限制。
影响匹配语句访问路径的表行可以与应用于相同语句的PLAN_TABLE优化提示共存。 Db2 当您在绑定或重新绑定时指定访问路径重用时,也会在同一目录表中创建和使用行。
影响访问路径的不同方法可以共存。 然而, Db2 只使用一种方法。 当同一语句可能适用多种方法时,仅使用第一种适用方法,优先顺序如下:
- PLAN_TABLE 访问路径提示
- 特定版本、集合和软件包的声明级访问路径或参数。
- 特定集合和包的声明级访问路径或参数。
- 声明级访问路径或参数,具有系统范围。
- Db2 在内部创建的声明级访问路径,用于访问路径的重复使用
- 语句级谓词选择优先于
当发出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”。 下表总结了有效的组合。
| 组合结果 | 访问路径_
提示栏 |
选项_
覆盖列 |
选择性_
覆盖列 |
|---|---|---|---|
| 访问路径已指定 | “Y” | 'N' | 'N' |
| 访问路径已指定 | “Y” | 空白 | 'N' |
| 选项和选择行已指定 | 'N' | “Y” | “Y” |
| 仅指定了选项覆盖。 | 'N' | “Y” | 'N' |
| 仅指定选择性覆盖。 | 'N' | 'N' | “Y” |
| 可以根据其他列的值指定选项覆盖 | 'N' | 空白 | “Y”或“N” |
| 根据其他列和PLAN_TABLE中的值,可以指定访问路径和优化参数。 访问路径优先于其他方法。 未指定选择性覆盖。 这种组合是为了兼容性。 不过,在创建新提示或覆盖时,最好指定每个列的值。 |
空白 | 空白 | 'N' |
您不能在语句级访问路径中指定与其他语句级方法结合使用,以影响同一应用程序上下文中的同一 SQL 语句的访问路径。 但是,您可以在同一应用程序上下文中覆盖谓词选择,并为同一语句指定语句级优化参数。
- 优先于谓词的选择性。
- 指定语句级优化参数。
- 指定语句级别的访问路径。
例如,假设 SYSIBM.SYSQUERY 目录表已经包含一行,指定了 SQL文本语句和 S1 模式:
STMTTEXT SCHEMA PACKAGE
SQL-text S1 假设当DSN_USERQUERY表包含指定的行时,您按顺序发出BIND QUERY命令:
- 仅指定 SQL文本的行。 Db2 替换现有行。 特定于模式的目录表行被全局行替换,用于匹配语句。 SYSIBM.SYSQUERY 表格中仍然只有一行。
STMTTEXT SCHEMA PACKAGE SQL-text - 一行指定 SQL文本和 S2 模式。 全局目录表中的行被新的特定架构行取代。 SYSIBM.SYSQUERY 表格现在只有一行:
STMTTEXT SCHEMA PACKAGE SQL-text S2 - 一行指定 SQL文本和 S1 模式。 新的一行被插入,不会替换现有的一行。 SYSIBM.SYSQUERY 表格现在有两行:
STMTTEXT SCHEMA PACKAGE SQL-text S2 SQL-text S1 - 一行代码,用于指定 SQL文本、 S1 架构和 P1 包。 SYSIBM.SYSQUERY 表格现在有三行:
- 一行代码,用于指定 SQL文本、 S1 架构和 P2 包。 Db2 插入新的一行。 SYSIBM.SYSQUERY 表格现在包含四行:
STMTTEXT SCHEMA PACKAGE SQL-text S2 SQL-text S1 SQL-text S1 P1 SQL-text S1 P2