top

笔记252 SQLSERVER2012 列存储索引

笔记252 SQLSERVER2012 列存储索引

 

复制代码
 SQLSERVER2012 列存储索引
与传统索引采用不同的存储列方式,它有效地压缩了索引中的数据。在常规索引中,所有每行的索引数据都被一起保持在一页中,每列数据在一个索引中是跨所有页保留的。而在列存储索引中,每列数据被保存在一起,这样每个数据也都只包含来自单个列的数据。
此外,每列的索引数据都进行了压缩,因为许多列都可能包含非常重复的数据值,所以压缩率非常高。这种架构降低了索引中的页数量,如果你只选择几列,它还能降低需要扫描的页数量。
利用相同的规则,你可以创建常规索引,其中包含你需要的列。这里有几点要注意,创建列存储索引比创建常规索引需要的时间要长很多,将来可能得到改进。另外,一旦你在表中增加了一个列,该表就变成只读了,不能插入,更新或者删除。如果你需要插入新行或者修改现有行,你可以禁用该索引,然后做数据修改,然后再重建列存储索引。由于存在这一限制,这一功能到目前为止更适用于数据仓库这类包含静态数据的表,这种表中只是定期刷新数据,这是可以接受的。然而,你可以利用分区来避免重建索引。例如,你可以创建按日,按周或者按月分区,把数据加载到新的分区表,新建回所有的非聚集索引,然后把历史数据切换到分区表,在分区表上建立非聚集列存储索引。
为什么列存储索引提供了更快的查询呢?有三个原因。



第一个原因:因为索引中的列数据被压缩了,它占用的空间更小,因此SQL Server只需扫描更少的页。


第二个原因,因为只需要扫描更少的页,SQL Server就可以把它们保留在内存中,大大地提高了数据停留在内存缓冲区的可能性。因此,在那些内存大的系统中,你会看到更大的性能差异,尤其是当索引被扫描多次并且相应的行存储索引不能装入内存时更明显。


第三个原因,SQL Server只需要提取查询中用到的列的索引页,而常规索引需要提取全部索引页,
包括查询中用不到的那部分。因此,你又一次得到了益处,更少的页需要处理,就会更快得到结果,同样SQL Server也更可能把列缓存保持在内存缓存区中。


 第四个原因, 列存储索引的数据页是在bufferpool的一个单独开辟的区域,跟行存储缓冲区是隔离的
 
复制代码

 

 

列存储索引的好处是,可以作为纯olap也可以作为htap的场景

 

作为htap的场景:为了前期的灰度测试,列存储索引可以先上线到二级索引

CREATE COLUMNSTORE INDEX idx_ci ON FactOnlineSales_Temp(DateKey)
GO

作为纯olap的场景:在 表级别 上更改为聚集列存储索引

CREATE CLUSTERED COLUMNSTORE INDEX idx_ci ON FactOnlineSales_Temp
WITH (DROP_EXISTING = ON)
GO

 

 

 

f

https://www.youtube.com/watch?v=VasYevUAStk

https://www.youtube.com/watch?v=elR5WCkoG5w

每个月blob数据页只存储一个字段的数据

 

posted @   桦仔  阅读(616)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示