SQL SERVER 2012在表上建列存储索引会改变表的数据结构(或存储方式)吗?

时间:2022-12-15 08:59:56
“xVelocity 内存优化的列存储索引,对每列的数据进行分组和存储,然后联接所有列以完成整个索引。 这不同于传统索引,传统索引对每行的数据进行分组和存储,然后联接所有行以完成整个索引。--msdn
按我的理解,建非聚集的索引是不会改变表的数据结构,难道列存储索引会?这是我在csdn的处女贴,求解答

6 个解决方案

#1


列索引不能做Clustered Index的,所以只是非聚集索引才可以成为列索引,当然不会影响存储了。
http://technet.microsoft.com/en-us/library/gg492088.aspx

#2


列存储索引就是非聚族索引,因此既然楼主已经说了非聚族索引的建立不会影响表的结构,那么列存储索引当然不会影响表的结构。楼主可以在数据库中试试:

--创建成功
create nonclustered columnstore index PK__TestTabl__ColumnStore
on TestTable(c1,c2)


--会报错
create clustered columnstore index PK__TestTabl__ColumnStore
on TestTable(c1,c2)

#3


引用 1 楼 SmithLiu328 的回复:
列索引不能做Clustered Index的,所以只是非聚集索引才可以成为列索引,当然不会影响存储了。
http://technet.microsoft.com/en-us/library/gg492088.aspx

列索引不能做Clustered Index这个我知道,但是msdn里说列存储索引是按列方式来存储的,而之前传统的索引是按行来存储,我现在就不理解它是如何实现按列来存储数据,能说一下列存储索引存储的原理吗?msdn里面说得不太明白,网上资料也不是很多

#4


按列存储就是说一个PAGE这个列,而默认的是按照一行存储在一个Page。所以对于大树据只查询少量列的话,列索引就有很大的优势,因为PAGE少了很多,IO会有很大的提升,而且内存可以充分发挥作用。

另外提一下在2014的版本中其实列索引是可以做为Clustered Index的。

#5


引用 4 楼 SmithLiu328 的回复:
按列存储就是说一个PAGE这个列,而默认的是按照一行存储在一个Page。所以对于大树据只查询少量列的话,列索引就有很大的优势,因为PAGE少了很多,IO会有很大的提升,而且内存可以充分发挥作用。

另外提一下在2014的版本中其实列索引是可以做为Clustered Index的。


对索引的数据结构了解的不是很清楚,是不是这样理解:列存储索引通过新建一些PAGE来按列存储数据(而不是改变原来的表存储结构),然后通过关键字-地址来维护跟这些PAGE的关系

#6


引用 5 楼 fengqiaoxueyue 的回复:
Quote: 引用 4 楼 SmithLiu328 的回复:

按列存储就是说一个PAGE这个列,而默认的是按照一行存储在一个Page。所以对于大树据只查询少量列的话,列索引就有很大的优势,因为PAGE少了很多,IO会有很大的提升,而且内存可以充分发挥作用。

另外提一下在2014的版本中其实列索引是可以做为Clustered Index的。


对索引的数据结构了解的不是很清楚,是不是这样理解:列存储索引通过新建一些PAGE来按列存储数据(而不是改变原来的表存储结构),然后通过关键字-地址来维护跟这些PAGE的关系

可以这样理解。 不过列索引都是单独的LOB PAGE。 

#1


列索引不能做Clustered Index的,所以只是非聚集索引才可以成为列索引,当然不会影响存储了。
http://technet.microsoft.com/en-us/library/gg492088.aspx

#2


列存储索引就是非聚族索引,因此既然楼主已经说了非聚族索引的建立不会影响表的结构,那么列存储索引当然不会影响表的结构。楼主可以在数据库中试试:

--创建成功
create nonclustered columnstore index PK__TestTabl__ColumnStore
on TestTable(c1,c2)


--会报错
create clustered columnstore index PK__TestTabl__ColumnStore
on TestTable(c1,c2)

#3


引用 1 楼 SmithLiu328 的回复:
列索引不能做Clustered Index的,所以只是非聚集索引才可以成为列索引,当然不会影响存储了。
http://technet.microsoft.com/en-us/library/gg492088.aspx

列索引不能做Clustered Index这个我知道,但是msdn里说列存储索引是按列方式来存储的,而之前传统的索引是按行来存储,我现在就不理解它是如何实现按列来存储数据,能说一下列存储索引存储的原理吗?msdn里面说得不太明白,网上资料也不是很多

#4


按列存储就是说一个PAGE这个列,而默认的是按照一行存储在一个Page。所以对于大树据只查询少量列的话,列索引就有很大的优势,因为PAGE少了很多,IO会有很大的提升,而且内存可以充分发挥作用。

另外提一下在2014的版本中其实列索引是可以做为Clustered Index的。

#5


引用 4 楼 SmithLiu328 的回复:
按列存储就是说一个PAGE这个列,而默认的是按照一行存储在一个Page。所以对于大树据只查询少量列的话,列索引就有很大的优势,因为PAGE少了很多,IO会有很大的提升,而且内存可以充分发挥作用。

另外提一下在2014的版本中其实列索引是可以做为Clustered Index的。


对索引的数据结构了解的不是很清楚,是不是这样理解:列存储索引通过新建一些PAGE来按列存储数据(而不是改变原来的表存储结构),然后通过关键字-地址来维护跟这些PAGE的关系

#6


引用 5 楼 fengqiaoxueyue 的回复:
Quote: 引用 4 楼 SmithLiu328 的回复:

按列存储就是说一个PAGE这个列,而默认的是按照一行存储在一个Page。所以对于大树据只查询少量列的话,列索引就有很大的优势,因为PAGE少了很多,IO会有很大的提升,而且内存可以充分发挥作用。

另外提一下在2014的版本中其实列索引是可以做为Clustered Index的。


对索引的数据结构了解的不是很清楚,是不是这样理解:列存储索引通过新建一些PAGE来按列存储数据(而不是改变原来的表存储结构),然后通过关键字-地址来维护跟这些PAGE的关系

可以这样理解。 不过列索引都是单独的LOB PAGE。