我一直在为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
你明白了。大多数这些列的基数非常明显,并且在选择性方面很容易构建索引。使用正确的顺序对WHERE子句中使用的所有字段进行索引已经非常成功地加快了速度。但是,连接列有点令人困惑。
许多列已经被自己编入索引,包括A.ID1和A.ID2,它们一起构成了表的主键。我认为这是一个聚集索引。还有一些自己索引的外键ID对。我想知道的是,如果在覆盖WHERE子句字段的索引中包含连接中使用的这些列是必要的,甚至是有用的。我听说它说很多连接列应该被索引,WHERE子句列应该被索引,它们是,但是分开。我真的没能在这个问题上找到任何明确的(或者通常是一个好主意,但并非总是如此)。这种事情的一般做法是什么?如果查询很重要,请将它们分开或将它们放在一起?
此外,A.SEVEN是一个具有唯一值的列,但我们只在ORDER BY中使用它。同样,我还没有确切地找到任何确定的东西,但事实上它只在ORDER BY中使用(好吧,并且在SELECT语句中)影响它在索引中的位置而不管基数(即它放在最后)索引因为它不会被用于过滤,只是排序,或者由于唯一性而将它放在开头),还是应该留在单独的索引中?
作为事后的想法,A.FOUR列只检查为空。这是否意味着任何非空数据的基数是无关紧要的,它应该放在索引的后期,因为我们只是在寻找空值? A.FOUR可能主要是空值,但在非空时将非常独特。
答案 0 :(得分:0)
通常,数据库索引就像书籍索引:当你想要找到某些内容时,你会从搜索词的左侧开始,而不是在中间。因此,如果您有一个复合索引(last name
,first name
),您可以期望复合索引仅在姓氏上正常工作,但不能仅在名字上正常工作。如果您只想加入名字,则需要单独索引first name
。