1

当我在 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 ​​时起作用吗?表很大,插入\更新不那么频繁

4

3 回答 3

2

是的,create index 上的多个字段 = 根据定义组合:指定两个或多个列名以创建组合索引。

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

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

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

如果您有时有一个、另一个或两者都有,那么创建所有 3 个索引也是可能的。但请记住,每个额外的索引都会增加插入、更新或删除所需的时间,因此在高度维护的表上,更多的索引通常是不好的,因为维护索引的开销会影响性能。

于 2011-12-17T13:30:21.030 回答
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

于 2011-12-17T13:29:37.383 回答
0

A、B 上的索引是复合索引,当然可以用于仅在 A 上查找或在 A 上与 B 一起查找或进行一般扫描。

There is usually not much of a point in having an index on A, B and an index on just A, since a partial search on A, B can be used if you only have A. That wider index will be a little less efficient, however, so if the A lookup is extremely frequent and the write requirements mean that it is acceptable to update the extra index, it could be justifiable.

Having an index on B may be necessary, since the A, B index is not very suitable for searches based on B only.

于 2011-12-17T13:38:08.903 回答