在没有文字值的情况下,查询优化器可用的信息不足可以解释这种行为。
当谓词中提供文字值时,优化器可以使用值分布统计信息tableA.identcol
来估计有多少行可能与条件匹配。显然,分布是这样的,给定提供的文字值,它认为基于索引的访问更好。
相反,当您提供子查询时,优化器无法知道identval
将返回什么,因此它会做出猜测,在您的情况下结果是次优的。
为了获得更一致的优化结果,您需要向优化器提供额外的信息。您可以尝试几个选项。
- 创建一个统计视图,类似于
create view sv1 as select Col1 from TableA, ParamTable where TableA.identcol > ParamTable.identval
(并从您的查询中删除bigint()
- 无需再混淆优化器)。然后,您需要启用统计视图优化 ( alter view sv1 enable query optimization
) 并收集分布统计信息 ( runstats on table sv1 with distribution
)。但是,看到其中ParamTable
只有一行,人们可能会认为它的更改非常频繁,因此您需要确保每次ParamTable.identval
更改时都会更新统计信息。
向优化器提供明确的选择性估计:Select Col1 from TableA where identcol > (select bigint(identval) from ParamTable) selectivity 0.001
. 在执行此操作之前,您需要设置启用此行为的 DB2 注册表变量 ( db2set DB2_SELECTIVITY=ALL
) 并重新启动实例。0.001
表示表格中满足条件的比例,在本例中为 0.1%。替换0.001
为对匹配行比例的实际估计。
TableA (identcol, Col1)
如果它尚不存在,则创建一个索引(并为其收集统计信息)——这可能会启用仅索引访问。