如果您对分区有深入的了解,那么您将完全意识到分区不是行存储索引的性能特征。但是,每当我看到对此提出论点时,就像Gail Shaw 在这里最令人信服地所做的那样,论点都取决于将非分区索引与分区索引进行比较,其中两个索引都以分区键作为其前导键。像 Gail 这样的论点基于分区消除和以您的分区键作为第一个键来寻找非分区索引之间的性能差异很小。
这些论点很有说服力,但如果分区键不是分区索引的第一个键,情况又会怎样呢?在这种情况下,我们可以获得分区消除的好处,并且我们的前导键现在可用于搜索比我们将同一索引保留为非分区时要小得多的索引。这听起来应该比将同一索引保留为非分区时的性能有所提高。
总而言之,我的问题是:如果分区列不是索引的第一个键,那么对具有多个键的索引进行分区是否会提高性能?要回答这个问题,只需要一个例子,并附上一些理论来解释为什么结果是这样的。
是的。SQL Server 已经可以高效地对聚集索引的前导列执行范围扫描。对该列进行分区实际上不会为查询计划的选项添加任何内容。
但是,按尾随列进行分区增加了另一种高效消除数据的方法。计划仍然可以使用前导列高效地进行查找,即使它需要在每个分区中进行查找。但此外,计划还可以对尾随列进行分区消除。
考虑具有聚集键(CustomerID、ProductId、SalesDate)的销售事实
如果分区列是 SalesDate 而不是 CustomerId(或者根本没有分区),则会更便宜。
分区不是一种性能特性,因为它并不总是甚至通常不会提高性能,但它确实对性能有影响,既有积极的,也有消极的。