我听说您应该将最具选择性的列放在索引声明的开头。例子:
CREATE NONCLUSTERED INDEX MyINDX on Table1 ( MostSelective, SecondMost, Least )
首先,我说的对吗?如果是这样,我是否可能会通过重新排列索引中列的顺序来看到性能上的巨大差异,还是更像是一种“不错的做法”?
我问的原因是因为在通过 DTA 进行查询后,它建议我创建一个索引,其中几乎所有与现有索引相同的列,只是顺序不同。我正在考虑将缺少的列添加到现有索引中并称其为好。想法?
看看这样的索引:
Cols 1 2 3 ------------- | | 1 | | | A |---| | | | 2 | | |---|---| | | | | | | | 1 | 9 | | B | | | | |---| | | | 2 | | | |---| | | | 3 | | |---|---| |
看看如何限制 A first,因为您的第一列比首先限制您的第二列消除了更多的结果?如果您想象必须如何遍历索引,第 1 列,然后是第 2 列等,这会更容易......您会看到在第一次通过中删除大部分结果会使第二步更快。
另一种情况,如果您查询第 3 列,优化器甚至不会使用索引,因为它对缩小结果集毫无帮助。 无论何时进行查询,在下一步之前缩小要处理的结果数量意味着更好的性能。
由于索引也是以这种方式存储的,因此当您查询第一列时,不会在索引中回溯以找到第一列。
简而言之:不,这不是为了炫耀,而是有真正的性能优势。