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

时间:2015-04-03 18:04:11

标签: sql-server database-indexes columnstore

以下是解释我的表格和情况的链接:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

数据缓存未命中的一种可能解释是来自列存储分配的缓冲池上的内存压力可能导致“页面刷新”。

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