为什么要创建复合非聚簇索引

时间:2014-03-16 19:40:22

标签: sql-server indexing sql-optimization

我正在尝试学习基本的索引和查询优化技术。我不明白为什么要创建一个复合非聚集索引。让我们考虑下面给出的场景。

  

ColumnA和ColumnB 上的复合非聚簇索引//相同的序列   

如果我将columnA单独或两者都放在where子句中,我会得到一个非聚集索引。那么columnB如何在索引查找中做出贡献,而不是在为索引创建B +树时吃掉它。如果我从索引中删除ColumnB会有什么不同吗?

1 个答案:

答案 0 :(得分:0)

这一切都取决于选择性。如果ColumnA和ColumnB都具有较低的选择性,并且您在where子句中同时使用它们,那么它可能值得拥有一个复合索引。在您的情况下,它不正确,因为即使您单独使用ColumnA查询也会使用索引。但是当你从索引中删除ColumnB时会发生什么?你当然节省空间。但要按ColumnB过滤数据库引擎需要查找聚簇索引中的行。现在它取决于ColumnA的选择性需要查找多少行。如果是3,那么你很好,如果它是3百万,那么你可能想要把复合索引放回去。另一件需要考虑的事情是你经常将两个列一起过滤?总是,大多数情况下很少?最后,您需要测试哪种方案更适合您的性能和空间要求。