默认情况下是db索引组合?

时间:2011-12-17 13:22:35

标签: sql db2 indexing composite-index

当我在db2上创建索引时,例如使用以下代码:

CREATE INDEX T_IDX ON T(
A,
B)

是综合指数吗? 如果不是:我怎么能创建一个复合索引? 如果是:为了有两个不同的索引,我应该单独创建它们:

CREATE INDEX T1_IDX ON T(A)
CREATE INDEX T2_IDX ON T(A)
编辑:这个讨论不是朝着我期望的方向发展(但是更好的方向:) :)我实际上问了怎么,而不是为什么要创建单独的索引,我计划在另一个问题中这样做,但是因为你期待我:

假设我有一个表T(A,B,C)和一个搜索函数search(),可以使用以下任何一种方法从表中选择

WHERE A = x
WHERE B = x
WHERE C = x
WHERE A = x AND B=y (and so on AC, CB, ABC)

如果我创建一个撰写索引ABC,它是否会在我选择C时才能工作? 该表非常大,而且插入\更新不那么频繁

3 个答案:

答案 0 :(得分:2)

根据定义,创建索引=复合的多个字段:指定两个或多个列名称以创建复合索引。

了解何时使用复合索引似乎是您的最后一个问题...

如果查询选择的所有列都在复合索引中,则dbengine可以从索引返回这些值而无需访问该表。所以你有更快的寻找时间。

但是,如果在查询中使用了一个或另一个,那么创建单个索引将为您提供最佳服务。这取决于执行的查询类型以及它们包含/过滤/加入的值。

如果您有时拥有一个,另一个或两者,那么创建所有3个索引也是可能的。但请记住,每增加一个索引会增加插入,更新或删除所需的时间,因此在高度维护的表中,由于维护索引的开销会影响性能,因此更多索引通常会很糟糕。

答案 1 :(得分:0)

第一个答案:是

CREATE INDEX JOB_BY_DPT
      ON EMPLOYEE (WORKDEPT, JOB)

第二回答:

这取决于您的查询;如果大多数时候你的查询引用where子句中的单个列,如select * from T where A = 'something'那么单个索引就是你想要的,但如果A和B列都被引用,那么你应该去创建一个复合索引。

如需进一步参考,请查看

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000919.htm

答案 2 :(得分:0)

A,B上的索引是一个复合索引,当然可用于在A上寻找或在A上寻找B或进行一般扫描。

A,B上的索引和A上的索引通常没什么意义,因为如果你只有A,可以使用A,B的部分搜索。那个更宽的索引会有点然而,效率较低,因此如果A查找非常频繁并且写入要求意味着更新额外索引是可以接受的,那么它可能是合理的。

在B上有索引可能是必要的,因为A,B索引不太适合仅基于B的搜索。