以下是解释我的表格和情况的链接:
在比较这两种情况时,一种是使用列存储索引运行查询,另一种是在简单堆上运行查询。当我比较这两个结果时,我观察到即使使用列存储的查询比另一种情况执行得更好,但只是在堆上运行。但是,使用列存储索引的查询涉及物理读取(1),而原始的不涉及。
这两个查询具有相同的执行计划。此外,我在暖缓冲区和冷缓冲区中都运行查询。在冷缓冲区中,原始查询需要 4 次物理读取,而在警告缓冲区中,它需要 0 次物理读取。然而,使用列存储索引的查询行为保持不变。这背后有什么特别的原因吗?
以下是解释我的表格和情况的链接:
在比较这两种情况时,一种是使用列存储索引运行查询,另一种是在简单堆上运行查询。当我比较这两个结果时,我观察到即使使用列存储的查询比另一种情况执行得更好,但只是在堆上运行。但是,使用列存储索引的查询涉及物理读取(1),而原始的不涉及。
这两个查询具有相同的执行计划。此外,我在暖缓冲区和冷缓冲区中都运行查询。在冷缓冲区中,原始查询需要 4 次物理读取,而在警告缓冲区中,它需要 0 次物理读取。然而,使用列存储索引的查询行为保持不变。这背后有什么特别的原因吗?
SQL Server 2012 中发生了很多变化,包括新的 DMV、新的内存管理和添加的 COLUMNSTORE 索引。
问题:使用列存储索引进行查询会导致物理读取(数据缓存未命中)。
假设:SQL Server 2012,聚集列存储索引
免责声明:这不是答案,而是进一步讨论的尝试。
列存储(SQL Server 2012 中的新功能)缓存列存储索引对象(压缩),并且此内存与缓冲池分开。
SQLOS 中新的任意页分配器在 SQL Server 2012 中简化了内存分配,取代了单页 8 KB 和多页分配器(用于大于 8 KB 的请求)。
缓冲池和列存储缓存都通过任意页分配器分配内存。但是,缓冲池缓存数据页,列存储缓存压缩的列存储索引对象。
数据缓存未命中的一个可能解释是列存储内存分配对缓冲池的内存压力可能导致“页面刷新”。
我使用SQL Server 2012 internals一书作为参考。此外,本文解释了 SQL Server 2012 中 COLOMNSTORE 索引如何使用内存: 聚集列存储索引 - 第 38 部分(“内存结构”)