db2 10.5多列索引说明

时间:2016-03-02 21:34:07

标签: indexing db2 multiple-columns

我第一次使用数据库中的索引,到目前为止我已经知道如果你有一个多列索引,比如索引('col1','col2','col3'),并且你做了查询使用col2 ='col2'和col3 ='col3'时,该索引不会被使用。

我还了解到,如果色谱柱的选择性列非常低。索引是没用的。 但是,从我的测试来看,似乎以上都不是真的。有人可以解释一下吗?

我有一张超过1600万条记录的表格。假设claimID是主键,那么有一个historynumber列只有3个不同的值(1,2,3),最后一列的storeNumber有大约100万个不同的值。

我有一个索引单独的claimID,另一个索引(historynumber,claimID),以及其他索引(historynumber,storeNumber),最后索引(storeNumber,historynumber)。

我的猜测是,如果我这样做:

select * from my_table where claimId='123456' and historynumber = 1 

会比

快得多
select * from my_table where historynumber = 1 and claimId = '123456'

然而,2具有完全相同的性能(即时)。所以我认为主键索引可以适用于任何列顺序。因此,我尝试了同样的事情,但在historynumber和storeNumber上。结果完全一样。然后我开始尝试没有索引的列,当然结果也一样。

最后,我做了一个

select * from my_table where historynumber = 1 

并且查询需要很长时间我必须取消它。

所以我的结论是where子句中的列顺序完全没用,索引定义中的列顺序也是如此,因为数据库看起来很聪明,足以告诉哪个列是最高选择性列。

有人可以给我一个可以证明其他情况的例子吗?

1 个答案:

答案 0 :(得分:0)

索引解释是一个很大的话题。 不要担心SQL中不同属性的顺序 - 无论是否指定

都无效
...where claimId='123456' and historynumber = 1 

或反过来。优化程序检查并优化每个SQL。为了证明如何访问数据,您可以执行EXPLAIN。有关详细信息,请查看文档。

针对您的其他问题

select * from my_table where historynumber = 1 

索引为(storeNumber,historynumber)。 你有没有试过在电话簿中查找来电者的姓名(有电话号码)? 好吧,对于索引来说几乎是一样的 - 所以当索引中的creatin重要时,列顺序! 有些技术可以提供帮助 - 即索引跳转扫描 - 但不能保证。

查看以下站点以了解有关DB2索引的更多信息:

http://db2commerce.com/2013/09/19/db2-luw-basics-indexes/

http://use-the-index-luke.com/sql/where-clause/the-equals-operator/concatenated-keys