2016-03-02 26 views
0

我第一次使用数据库中的索引,到目前为止我已经了解到,如果您有索引('col1','col2','col3')等多列索引, ,如果你做了一个使用col2 ='col2'和col3 ='col3'的查询,那么该索引就不会被使用。db2 10.5多列索引解释

我还了解到,如果一列色谱柱的选择性非常低。索引是无用的。 但是,从我的测试来看,上述情况似乎都不是真的。有人能解释更多吗?

我有一个超过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子句中的列顺序是完全无用的,索引定义中的列顺序也是如此,因为看起来数据库足够聪明,可以告诉哪个列是最高选择性列。

有人能给我一个可以证明的例子吗?

回答

0

指数解释是一个巨大的话题。 不要担心在SQL不同属性的顺序 - 它是否指定

...where claimId='123456' and historynumber = 1 

或其他方式轮没有影响。每个SQL都由优化器进行检查和优化。为了证明数据如何被访问,你可以做一个解释。检查文档以获取更多详细信息。

您的其他问题

select * from my_table where historynumber = 1 

与(storeNumber,historynumber)的索引。 你有没有试过在电话簿中查询来电者的名字(有电话号码)? 对于一个指数来说,它几乎是一样的 - 所以当创建索引时的列顺序很重要! 有些技术可以帮助 - 即索引跳转扫描 - 但不能保证。

退房以下网站了解更多一点关于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

+0

嘿,感谢回答。第二个查询不是问题。我只是确保historynumber = 1的查询需要很长时间而不是立即执行,否则我的其他测试会失败。我今天做了很多研究,所有人都表示这个订单会有所作为。我无法找到我今天阅读的所有链接,但这里有一些情况如此: [link1](http://stackoverflow.com/questions/179085/multiple-indexes-vs-multi-column - 指数) [链接2](http://stackoverflow.com/questions/5542895/sql-indexes-and-performance-improvement) – user3758745

+0

那么缺少什么?否则,我的答案恰恰恰到好处? – MichaelTiefenbacher

+0

这些链接正在讨论MS SQL Server。索引的使用通常是DBMS特有的。在DB2上,'WHERE'中的顺序并不重要...并且在DB2上我至少建议最有选择性的列首先在索引中。同样在DB2 for i上,'historynumber = 1'查询可能使用全表扫描,因为查询引擎可能会确定超过30%的行将被返回。 – Charles