【发布时间】:2013-04-13 05:45:21
【问题描述】:
我正在优化 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 放在索引的前面。
【问题讨论】:
标签: sql join indexing db2 sql-order-by