SQL Server 2016 - ColumnStore 聚集索引与非 ColumnStore 聚集索引

Ran*_*der 5 sql-server columnstore sql-server-2016

我刚刚阅读了位于此处的 SQL 2016 列存储索引指南。我们将在 SQL 2016 数据库中有一些相当大的表(数亿到数十亿行),用于 OLTP 和分析。

这些表将主要通过以下两种方式之一进行查询: 1) 用户将根据 Where 子句中的特定离散值检索相当小的结果集(例如,Where SubId = 'ABC');2) 用户将根据日期/时间值范围检索更大的结果集(例如,其中 ReadTime 介于 '2/1/2017' 和 '2/5/2017' 之间)。

由于列存储索引更适合场景 #2(我认为),我正在考虑为场景 #1 制作非列存储(例如,在 SubId 上)并创建非聚集列存储索引(例如,在 ReadTime 上) ) 用于场景 #2。

但是,我不确定这是否真的比在 ReadTime 上创建列存储聚集索引和在 SubId 上创建非列存储索引更好。

我不确定如何做出这个决定。

Han*_*non 2

聚集列存储索引主要用于数据仓库、OLAP 或报告解决方案。他们不擅长WHERE x = y类型查询;他们擅长WHERE x < 1 and x > 1000000类型查询,查询处理器可以在 CCI 上执行范围扫描。

假设您的工作负载是 OLTP 关键型,我建议您无需做大量工作,即可使用标准 B 树聚集索引创建表,并考虑精心设计的非聚集列存储索引,这将有助于您的观点#2.

如果工作负载的 OLTP 组件很小,或者不是很关键,但报告组件关键,您可以将表创建为聚集列存储索引,然后添加许多标准 B 树非聚集索引来帮助支持 OLTP成分。