列存储的物理读取比堆中的多

Physical reads with column-store more than that in a heap

下面是 link 解释我的 table 和情况:

Why does the presence of primary key on the table significantly enhance the performance of column-store indexes?

比较两种情况时,一种是 运行 使用列存储索引的查询,另一种是 运行 在简单堆上的查询。当我比较这两个结果时,我观察到即使使用列存储的查询在堆上简单地 运行 时比其他情况执行得更好。 但是,使用列存储索引的查询涉及物理读取(1),而原始的则没有。

两个查询具有相同的执行计划。另外,我 运行 在暖缓冲区和冷缓冲区中的查询。在冷缓冲区中,原始查询需要 4 次物理读取,而在警告缓冲区中,需要 0 次物理读取。 然而,使用列存储索引的查询行为保持不变。这背后有什么特别的原因吗?

SQL Server 2012 发生了很多变化,包括新的 DMV、新的内存管理和添加的 COLUMNSTORE 索引。

问题:使用列存储索引的查询导致物理读取(数据缓存未命中)。

假设:SQL Server 2012,聚集列存储索引

免责声明:这不是答案,而是进一步讨论的尝试。

列存储(SQL Server 2012 中的新功能)缓存列存储索引对象(压缩)并且该内存与缓冲池分开。

SQL Server 2012 中的内存分配通过 SQLOS 中新的任意页分配器进行了简化,取代了单页 8 KB 和多页分配器(对于 > 8 KB 的请求) ).

缓冲池和列存储缓存都通过任意页分配器分配内存。但是,缓冲池缓存数据页,列存储缓存压缩的列存储索引对象。

数据缓存未命中的可能解释是列存储内存分配对缓冲池的内存压力可能导致 "page flushing."

我使用 SQL Server 2012 internals 这本书作为参考。此外,本文解释了 COLOMNSTORE 索引如何在 SQL Server 2012 中使用内存: Clustered Columnstore Indexes – part 38 (“Memory Structures”)