0

查询在一个巨大的表上运行(10 亿条记录 +)

从 TableA 中选择 Col1,其中 identcol >(从 ParamTable 中选择 bigint(identval))

( identvaldataype is character and identcolis BIGINT) 这需要很长时间并且会进行全表扫描。当我替换子查询并在 identcol 的 where 子句中使用数字值时,它开始使用该列上的索引。

有没有办法强制 DB2 使用这个索引,而不指定文字值?(AIX 上的 DB2 9.7 luw)

编辑:我发现 BETWEEN 与子查询和上限值一起使用,并且还使用索引。此外,如果我删除显式转换为 BIGINT 它开始使用索引。但仍然想知道技术解释/指针。谢谢!

4

1 回答 1

2

在没有文字值的情况下,查询优化器可用的信息不足可以解释这种行为。

当谓词中提供文字值时,优化器可以使用值分布统计信息tableA.identcol来估计有多少行可能与条件匹配。显然,分布是这样的,给定提供的文字值,它认为基于索引的访问更好。

相反,当您提供子查询时,优化器无法知道identval将返回什么,因此它会做出猜测,在您的情况下结果是次优的。

为了获得更一致的优化结果,您需要向优化器提供额外的信息。您可以尝试几个选项。

  1. 创建一个统计视图,类似于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更改时都会更新统计信息。
  2. 向优化器提供明确的选择性估计: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为对匹配行比例的实际估计。

  3. TableA (identcol, Col1)如果它尚不存在,则创建一个索引(并为其收集统计信息)——这可能会启用仅索引访问。

于 2015-09-10T01:14:50.283 回答