合 SQL Server内置的HTAP技术
Tags: MSSQLSQL ServerHTAP
背景
2005年,Gartner正式提出了HTAP这一概念,并且迅速引起了一些企业的关注,被视为是未来数据发展的重要趋势之一。
到了2014年,Gartner又对HTAP数据库给出了明确的定义:混合事务/分析处理(HTAP)是一种新兴的应用体系结构,兼容两种业务场景。
混合负载(HTAP Hybrid Transactional/Analytical Processing)是在保留原有在线交易功能的同时,强调了数据库原生计算分析的能力。
HTAP体系架构解决的一个问题是 传统的数据仓库做数据分析的时效性问题,传统数据仓库架构需要用ETL工具从各种业务数据源(oltp)抽取数据到数据仓库(olap)进行跑批分析,这个时效大概是T+1。
传统数据类项目,如数据仓库、数据集市等其他数据应用类项目有跑批日期的概念,即在T+1日跑T日的交易数据,直白的说就是在第二天跑昨天的交易。
T指的是每天或者每一个交易日,我们经常说的跑批日期也是T日的数据。
无论是过去的传统数仓,还是现在的大数据技术栈,都存在这个时效性问题。HTAP体系架构的做法是,同时支持OLTP和OLAP场景,基于创新的计算存储框架,在同一份数据上保证事务的同时支持实时分析,省去费时的ETL过程。
SQL Server在OLAP上的发展
过去,SQL Server自带完整的数仓服务套件 ,方便用户搭建传统数仓,SQL Server企业版和数据中心版本身提供了三个服务
- 做数据ETL的SQL Server集成服务(SSIS)
- 做报表的SQL Server报表服务(SSRS)
- 做数据多维分析的SQL Server 分析服务(SSAS olap引擎)
相信大家在SQL Server安装界面看到过上面几个服务的安装选项。
后来,为了处理更大的数据量,微软推出SQL Server并行数据仓库(PDW),使用多个SQL Server数据库服务器在大规模并行处理架构下存储和处理数据。
再到最近十年,随着大数据技术栈发展迅猛,微软推出PolyBase用来整合SQL Server和Hadoop。
但是,以上技术还是需要ETL过程,存在时效性问题。
SQL Server的初代HTAP
初代HTAP首次出现在SQL Server2012版本,最初设计的目标,仅仅为了在OLTP中提供数仓场景下的OLAP能力,让用户可以直接在一个DBMS的行存表上建列存索引然后执行分析型负载,省去费时的ETL过程。
面对这样的目标,SQL Server2012提供的是一个面向OLAP的列存引擎,对应上层的接口就是Read-Only Columnstore Index,即在一个行存表上建立列存索引之后,这个表变为只读。
列存的存储格式很简单,每100万行组成一个Row Group,Row Group中每一个字段组成一个Column Segment,每个Column Segment的元数据存储在系统表中。列存索引只提供全表扫描。
图3-1
这样的设计,有两个问题:
- 整个表都不支持更新,只读状态
- 列存索引只能是非聚集列存索引,不能是聚集列存索引
SQL Server逐渐增强的HTAP
到了SQL Server2014和SQL Server2016这两个版本,微软逐渐增强了列存引擎的能力,解决了初代HTAP的两个缺点,开始支持更新,并支持表中只有列索引一份数据即聚集列存索引。
这时候,一个数据库融合了3种存储引擎,分别是:
图4-1
图4-2
为了支持更新,SQL Server引入了delta store、delete flag、rowid。
Delete Flag
在列存索引里删除一行数据时,实际上只是对这行数据加一个delete flag标记(bitmap标记),并不会物理删除这行数据
Delta Store
是相对磁盘上的列存Main Store来说的,用于缓存Insert。
Delta Store由Delta rowgroup实现,所有Delta rowgroup都统称为Delta Store,有些文献也叫tail index(下文中Delta Store 和 Delta rowgroup是同一个意思)
所有的rowgroup也统称为Main Store(下文中Main Store 和 rowgroup是同一个意思)
Delta Store在结构上是聚集 B树索引,提供热数据的原地更新删除,为Main Store做缓冲。
RowID
由列存引擎生成,用来在列存索引中唯一标记一行数据。
列存rowid在数据行插入到rowgroup时候生成,这个rowid一直到数据行被删除都不会改变。