假设您的 SQL Server 2019 计算机有一个查询,该查询命中一个基于磁盘的表,该表既长(假设有 3,000,000 行),又宽(假设有 150 列)。假设您检索了大多数行和大多数列。最后,假设该表很少更改。将其视为一个典型的报告服务器表,每天仅更新一次。
是否存在上述条件适用的情况,并且传统的行存储索引比列存储索引(聚集索引或其他)更可取?
我担心自己太容易被列存储索引所吸引,并且会开始在我所有的大而宽的表上使用它们。
假设您的 SQL Server 2019 计算机有一个查询,该查询命中一个基于磁盘的表,该表既长(假设有 3,000,000 行),又宽(假设有 150 列)。假设您检索了大多数行和大多数列。最后,假设该表很少更改。将其视为一个典型的报告服务器表,每天仅更新一次。
是否存在上述条件适用的情况,并且传统的行存储索引比列存储索引(聚集索引或其他)更可取?
我担心自己太容易被列存储索引所吸引,并且会开始在我所有的大而宽的表上使用它们。
如果您选择整个表(或接近整个表,用您上面的话来说),索引通常不会对您有太大帮助,特别是如果您选择存储的列并且不对它们进行任何类型的聚合、计算或操作。
由于您特别提到这是一个 OLAP 上下文,如果您正在进行某种聚合,那么列存储索引至少可以通过批处理模式执行为您带来好处:
再次,考虑到查询中将选择大多数列,您可能希望将列存储索引设为群集。这样,原始表将一起保存在列存储中,而不是在单独的索引中维护其副本。
我设法找到了一种行存储索引获胜的情况:当您关心唯一性时。许多类型的连接(尤其是合并连接)在知道连接的两侧都有唯一值时会变得更快。行存储索引可以通过主键/唯一键提供此知识,但列存储索引无法提供此知识。
如果您同时拥有这样的行存储索引和列存储索引,我发现优化器通常会选择列存储索引而不是行存储索引。据推测,它正确地估计了列存储索引的扫描成本要低得多,但错误地得出结论,这比使用行存储索引的唯一性更省力。
还有一些与哈希匹配相关的内容,但我不确定是什么。我发现,具有行存储索引的哈希连接会导致谓词传递到索引扫描中,但具有列存储索引的哈希连接将使过滤器成为执行计划中的显式运算符。后者要慢得多。