DB2在同一列组合上的多个索引

DB2在同一列组合上的多个索引,db2,indexing,Db2,Indexing,假设我有一个带有C1,C2列的表T。。。C10 C1、C2和C3是多个查询中最常引用的列。无法控制引用这些列的顺序 为了提高查询性能,我是否需要创建多个索引,如(C1、C2、C3)、(C1、C3、C2)、(C2、C1、C3)、(C2、C3、C1)等 以两个类似的查询为例 选择* 从t1到t2 其中t1.c1=t2.c1 t1.c2=t2.c2 t1.c3=t3.c3 及 选择* 从t1到t2 其中t1.c2=t2.c2 t1.c1=t2.c1 t1.c3=t3.c3 我是否需要两个索引(C1、C

假设我有一个带有C1,C2列的表T。。。C10

C1、C2和C3是多个查询中最常引用的列。无法控制引用这些列的顺序

为了提高查询性能,我是否需要创建多个索引,如(C1、C2、C3)、(C1、C3、C2)、(C2、C1、C3)、(C2、C3、C1)等

以两个类似的查询为例

选择* 从t1到t2 其中t1.c1=t2.c1 t1.c2=t2.c2 t1.c3=t3.c3 及

选择* 从t1到t2 其中t1.c2=t2.c2 t1.c1=t2.c1 t1.c3=t3.c3

我是否需要两个索引(C1、C2、C3)和(C2、C1、C3)来提高上述两个不同查询的性能,或者仅仅一个组合就足以满足这两个查询

我猜这不是必需的,并且假设只要使用C1、C2和C3,DB2就会足够聪明地重新排列查询中的列以匹配任何一个索引组合

有谁能证实并告诉我一些与此相关的文章吗


在AIX中使用的DB2版本是9.5

数据库调优并不是一个“一劳永逸”的操作,就像投资Bernie Madhoff的对冲基金一样:-)

您应该提供一个适度智能的初步猜测(基于预期行为),然后在生产中监控执行的查询

您至少应该从单个列上的索引开始。然后,如果有人抱怨他们的查询耗时太长,让DB2分析查询,看看瓶颈在哪里(解释计划或可视化解释)。在这一点上,您应该弄清楚添加索引的成本是否超过了收益

这是确保数据库正确调优的唯一方法

DB2可以重新排序以使用其他索引的假设完全取决于查询——除了最简单的查询之外,所有查询都会使您的假设无效

例如,假设您有索引(c1,c2)。询问

select * from t where c2 = '2009-01-01';
不会使用该索引,因为所有的
c2
关键部分都分散在索引周围,而不是在一个区域中

它可能足够智能,可以进行优化

select * from t where c2 = '2009-01-01' and c1 = 'x';
因为它可以在索引中查找
x2009-01-01
。但是,

select * from t where c2 <= '2009-01-01' and c2 <= '2009-01-05' and c1 = 'x';

select*fromt,其中c2在db2forlinux/UNIX/Windows中,从优化器的角度来看,查询中谓词和连接条件的顺序并不重要。优化器的查询重写部分将对此进行说明


根据查询,优化器可以选择索引,无论它是打开的(C3、C2、C1)还是打开的(C1、C2、C3)。然而,这并不是说索引中的列顺序不重要——它确实重要。通常,您希望将列按从最高基数到最低基数的顺序排列,但当然也有很多例外。有很多书都是关于正确的索引设计的(Lahdenmaki/Leach的书非常好),所以我建议您研究一下这些书。

我对DB2不是很确定,但在oracle中,wat是在我们创建索引时发生的

在T1(c1)上创建索引I1

然后它将在列(c1)上创建一个索引,并对其进行排序

如果是与您的情况相同的综合指数:

在T2(c1,c2)上创建索引I2

它将以排序格式存储数据。因此,记住这一点,我想查询上述索引中的第一列会更快,如下所示:

从T2中选择c1、c2


如果我有任何地方错了,请纠正我

让我重新表述我的问题。假设所有列C1、C2和C3都将用于多个查询(以不同的顺序),我是否需要对这三列进行多个索引排列。。。从t1、t2中选择*其中t1.c1=t2.c1和t1.c2=t2.c2和t1.c3=t3.c3,并从t1、t2中选择*其中t1.c2=t2.c2和t1.c1=t2.c1和t1.c3=t3.c3我需要两个索引(c1、c2、c3)和(c2、c1、c3)为了提高上述两个不同查询的性能,或者对于这两个查询来说,任何一个组合都足够了?DB2将做什么取决于收集的统计数据—处理这些子句的顺序将取决于结果集的基数,而结果集只能由统计数据确定。我非常确定默认情况(对于DB2/z,无论如何,我不知道AIX版本)是在没有可用统计数据的情况下按照给定的顺序进行处理。但是,这并不重要——您应该在目标环境中收集统计数据并进行解释,因为行为几乎肯定会改变。