列式索引将每一列单独存储在一组磁盘页中,而不是像传统方式那样在每个页中存储多个行。
CREATE COLUMNSTORE INDEX indexName on [table_name] ( [col1] , ... )
(1) 只有查询所涉及到的列才会从磁盘中获取出来(在典型的事实数据表中,查询所涉
及到的列不会超过总列数的15%) 。
(2) 由于每个列中都会有大量重复数据,因此这种数据结构更便于进行压缩, 列式聚集索引其实就是数据的一份拷贝,不仅可以大幅提高性能,而且还可以大大节省存储空间。
(3) 数据经过高度压缩后,缓冲区的命中率将大大提高,并且访问频繁的列将缓存在内
存中,而访问不频繁的列则不会长时间占用内存。
(1) 表之间的联接查询以及多列的联接查询很难通过列式索引大幅提高性能,甚至不会有任何性能提升。
(2) 添加列索引后表为只读
(1) 创建表且初始化 7,169,010数据
(2) 执行查询语句A:
SELECT TRANSACTIONTYPE,COUNT,TRANSACTIONID,posid,cashierid,
ITEMtype,ITEMCODE,GLOBALCODE FROM BOHRSCSALES_DAY_STD
WHERE GLOBALCODE>='87006189'
所需时间为2.201
(3) 创建列索引
CREATE COLUMNSTORE INDEX BOHRSCSALES_DAY_STD_col1
on BOHRSCSALES_DAY_STD (TRANSACTIONTYPE,COUNT,TRANSACTIONID
,posid, cashierid,ITEMtype,ITEMCODE,GLOBALCODE)
(4) 执行查询语句A, 所需时间为1.155
(5) 创建普通索引
CREATE INDEX BOHRSCSALES_DAY_STD_col2
on BOHRSCSALES_DAY_STD (TRANSACTIONTYPE,COUNT,
TRANSACTIONID,posid,cashierid,ITEMtype,ITEMCODE,GLOBALCODE)
(6) 执行查询语句A, 所需时间为1.170
(7) 同样执行A查询语句结果为:
没索引执行时间 > 普通索引执行时间 > 列索引执行时间