SQL Server 是否需要比传统行存储更多的 RAM 来保存列存储索引表?

Cyn*_*ker 5 index sql-server columnstore sql-server-2014

我想在一些非常大的宽表上实现(SQL Server 2014)聚集列存储索引。我需要更多内存来支持这个吗?如果是这样,我如何确定多少?

Cha*_*tox 6

更多的 RAM 而不是什么?与普通的聚集索引相比,数据被高度压缩,因此在查询期间应该占用更少的内存。但是,构建 CCI 的过程可能会占用大量内存。查看产品文档

计划足够的内存以并行创建列存储索引 除非内存受限,否则默认情况下创建列存储索引是并行操作。与串行创建索引相比,并行创建索引需要更多内存。当内存充足时,创建列存储索引的时间是在相同列上构建 B 树的时间的 1.5 倍。

创建列存储索引所需的内存取决于列数、字符串列数、并行度(DOP)和数据的特性。例如,如果您的表少于一百万行,SQL Server 将仅使用一个线程来创建列存储索引。

如果您的表有超过一百万行,但 SQL Server 无法获得足够大的内存授权来使用 MAXDOP 创建索引,则 SQL Server 将根据需要自动减少 MAXDOP 以适应可用内存授权。在某些情况下,DOP 必须减少到 1 才能在受限内存下构建索引。


men*_*osi 6

有几个方面需要考虑:

  1. columnstore 对象没有缓存在缓冲池中,而是缓存在它们自己的区域http://www.nikoport.com/2014/08/11/clustered-columnstore-indexes-part-38-memory-structures/但 SQL Server 管理为缓冲池或列存储对象池分配空间
  2. 列存储对象必须在数据加载到行组时进行处理,这是内存密集型操作
  3. 由于数据是高度压缩的,当数据存储在列存储中时,可以在 RAM 中缓存更多的数据,而不是存储为行时

至于您的“我是否需要更多 RAM”的问题,那么答案可能是否定的,因为引擎将在您创建索引时使用任何可用的 RAM,除非您受到严重限制。 http://www.nikoport.com/2014/06/21/clustered-columnstore-indexes-part-31-memory-pressure-and-row-group-sizes/