Column store index 列数据如何匹配成行数据?

简介:

SQL Server 2012引入了列存储索引,对每列的数据进行分组和存储,然后联接所有列以完成整个索引。这不同于传统索引,传统索引对每行的数据进行分组和存储,然后联接所有行以完成整个索引。

在访问基于行存储的索引时,如果要查询一个字段需要将整个Page读入内存,所以默认会读到所有行的数据:

通过上面的图片可以看出,如果一个查询只想查询字段A的值,代价是读取所有的页面,包括了不需要的字段B,C,D,E。 

 

与行存储模式相比,使用列存储只需要读取单独的列数据,这样可以减小IO的消耗,同时提供缓存的使用。

但是列存储索引是如何在磁盘存储的?如果我们只是将列的数据存储在一起,如何在查询的时候重新创建成行数据。

 

举个例子:如果字段“名称”存储了“Kevin”和“Allen”两个值,“生日”栏位存储了“19650112”和“”19680415“。那么我们在查询的时候如何能够将Kevin和生日匹配起来。

 

答案是数据的位置标明它属于哪一行。因此在“名称”字段中行1存储了“Kevin “,在“生日”栏位中第一行对应的存储了“19650112“。依次类推,这样查询的时候就可以将所有的栏位匹配为对应的行。

 

 

本文转自 lzf328 51CTO博客,原文链接:

http://blog.51cto.com/lzf328/1252919


相关文章
|
4月前
|
存储 关系型数据库 MySQL
第8章 索引index
第8章 索引index
33 0
|
6月前
|
SQL 存储 Oracle
为什么 GROUP BY 之后不能直接引用原表中的列
为什么 GROUP BY 之后不能直接引用原表中的列
43 1
|
6月前
|
索引
根据索引值计算item所在行列(row,col)索引序号(index)
根据索引值计算item所在行列(row,col)索引序号(index)
GROUP BY 一个以上的列
GROUP BY 一个以上的列
98 1
|
存储 SQL 关系型数据库
mysql索引类型 normal, unique, full text
mysql索引类型 normal, unique, full text
253 0
|
关系型数据库 MySQL 索引
mysql更新varchar类型字段长度报错:ERROR 1074 (42000): Column length too big for column ‘value‘ (max = 21845);
mysql更新varchar类型字段长度报错:ERROR 1074 (42000): Column length too big for column ‘value‘ (max = 21845);
|
SQL 关系型数据库 MySQL
【MySQL】根据相同值,拼接指定字段值,还可添加前缀后缀(GROUP_CONCAT()、CONCAT()、GROUP BY 联用)
【MySQL】根据相同值,拼接指定字段值,还可添加前缀后缀(GROUP_CONCAT()、CONCAT()、GROUP BY 联用)
482 0
【MySQL】根据相同值,拼接指定字段值,还可添加前缀后缀(GROUP_CONCAT()、CONCAT()、GROUP BY 联用)
|
SQL Go
【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例
【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例目录 0、填充数据1、使用row_number()函数对订单进行编号,按照订单时间倒序。
13129 0