我正在优化 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 放在索引的前面。