0

我正在优化 DB2 LUW 数据库的一些查询,并且我将重组一些现有的索引。但是,我有一些关于似乎没有明确定义的主题的问题,至少从我能够找到的内容来看。对于初学者,这里是查询本身的概要:

SELECT 
--About a dozen fields from TABLE A--
--A few fields from joined tables--
FROM
TABLE A
--A few inner join/left joins, mostly on A.ID1 and A.ID2, BIGINT generated keys--
WHERE
A.ONE = :x
AND A.TWO IN (:y)
AND A.THREE IN (--uncorrelated suquery--)
AND A.FOUR IS NULL
AND (A.FIVE BETWEEN :date1 AND :date2
OR
A.SIX = 'STUFF')
ORDER BY A.SEVEN

有几点需要注意:

  • 仅 A.ID1 和 A.ID2 上就有一个索引,可能是聚集索引,因为这是主键
  • A.SEVEN 上有一个索引
  • 我正在修改 WHERE 子句中其余字段的索引

所以所有的连接/过滤/排序列都被索引了。问题是:它们应该全部组合成一个索引还是分开?如果我将 A.SEVEN 放入同一个索引中,我是否仍想根据选择性放置它,或者这是否无关紧要,因为它没有过滤,只有排序?

编辑:我发现自己使用 OR 子句的通常更快的替代方法,至少在我正在使用的查询中:

CASE WHEN (first statement) THEN 1 
WHEN (second statement) THEN 1 
ELSE 0 
END = 1

这对某些查询非常有效,但与 OR 子句相比,我不确定它是否/如何影响索引的使用。此外,是否最好按照选择性顺序组织 ONE 到 FOUR,即如果 FOUR 只有 12 个不同的值而 ONE 有 10k,那么最好将 ONE 放在索引的前面。

4

1 回答 1

0

我对 DB2 对索引的特定处理并不十分熟悉。但是假设它像其他数据库一样,我认为您将无法使用索引进行最终排序。

基于该where子句的查询的一个好的索引是A(one, two, three, four). 之后,由于这种情况,您被困在five和之间。您可以将其中任何一个放入索引中。把两者都放进去可能不会有什么不同——只有第一个会被使用,第二个会通过扫描索引的那个部分来解决,以找到满足另一个条件的行。sixor

换句话说,索引的效用在你到达之前就已经结束了seven

如果 DB2 真的很复杂,它可能能够利用两个索引, A(one, two, three, four, five)并且 A(one, two, three, four, six). 再一次,由于or条件的原因,索引对order by.

由于相等条件,onetwothreefour和 在索引中按任意顺序排列。有一个警告。我不知道 db2 如何in使用子查询处理条件。我倾向于在A(one, two, four, three).

于 2013-04-19T18:38:48.773 回答