MSSQL · 特性分析 · 列存储技术做实时分析

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 摘要数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高。使用传统RDBMS数据分析架构,遇到了前所未有的挑战,高延迟、数据处理流程复杂和成本过高。这篇文章讨论如何利用SQL Server 2016列存储技术做实时数据分析,解决传统分析方法的痛点。传统RDBMS数据分析在过去很长一段时间,企业均选择传统的关系型数据库做OLAP和Data Warehouse工作。这一

摘要

数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高。使用传统RDBMS数据分析架构,遇到了前所未有的挑战,高延迟、数据处理流程复杂和成本过高。这篇文章讨论如何利用SQL Server 2016列存储技术做实时数据分析,解决传统分析方法的痛点。

传统RDBMS数据分析

在过去很长一段时间,企业均选择传统的关系型数据库做OLAP和Data Warehouse工作。这一节讨论传统RDBMS数据分析的结构和面临的挑战。

传统RDBMS分析架构

传统关系型数据库做数据分析的架构,按照功能模块可以划分为三个部分:

  • OLTP模块:OLTP的全称是Online Transaction Processing,它是数据产生的源头,对数据的完整性和一致性要求很高;对数据库的反应时间(RT: Response Time)非常敏感;具有高并发,多事务,高响应等特点。

  • ETL模块:ETL的全称是Extract Transform Load。他是做数据清洗、转化和加载工作的。可以将ETL理解为数据从OLTP到Data Warehouse的“搬运工”。ETL最大的特定是具有延时性,为了最大限度减小对OLTP的影响,一般会设计成按小时,按天或者按周来周期性运作。

  • OLAP模块:OLAP的全称是Online Analytic Processing,它是基于数据仓库(Data Warehouse)做数据分析和报表呈现的终端产品。数据仓库的特点是:数据形态固定,几乎或者很少发生数据变更,统计查询分析读取数据量大。
    传统的RDBMS分析模型图,如下图展示(图片直接截取自微软的培训材料):
    01.png

从这个图,我们可以非常清晰的看到传统RDBMS分析模型的三个大的部分:在图的最左边是OLTP业务场景,负责采集和产生数据;图的中部是ETL任务,负责“搬运”数据;图的右边是OLAP业务场景,负责分析数据,然后将分析结果交给BI报表展示给最终用户。企业使用这个传统的架构长达数年,遇到了不少的挑战和困难。

面临的挑战

商场如战场,战机随息万变,数据分析结果指导商业行为的价值越来越高,使得数据分析结果变得越来越重要,用户对数据实时分析的要求变得越来越高。使用传统RDBMS分析架构,遇到了前所未有的挑战,主要的痛点包括:

  • 数据延迟大

  • 数据处理流程冗长复杂

  • 成本过高

数据延迟大:为了减少对OLTP模块的影响,ETL任务往往会选择在业务低峰期周期性运作,比如凌晨。这就会导致OLAP分析的数据源Data Warehouse相对于OLTP有至少一天的时间差异。这个时间差异对于某些实时性要求很高的业务来说,是无法接受的。比如:银行卡盗刷的检查服务,是需要做到秒级别通知持卡人的。试想下,如果你的银行卡被盗刷,一天以后才收到银行发过来的短信提醒,会是多么糟糕的体验。

数据处理流程冗长复杂:数据是通过ETL任务来抽取、清洗和加载到Data Warehouse中的。为了保证数据分析结果的正确性,ETL还必须要解决一系列的问题。比如:OLTP变更数据的捕获,并同步到Data Warehouse;周期性的进行数据全量和增量更新来确保OLTP和Data Warehouse中数据的一致性。整个数据流冗长,实现逻辑异常复杂。

成本过高:为了实现传统的RDBMS数据分析功能,必须新增Data Warehouse角色来保存所有的OLTP数据冗余,专门提供分析服务功能。这势必会加大了硬件、软件和维护成本投入;随之还会到来ETL任务做数据抓取、清洗、转换和加载的开发成本和时间成本投入。

那么,SQL Server有没有一种技术既能解决以上所有痛点的方法,又能实现数据实时分析呢?当然有,那就是SQL Server 2016列存储技术。

SQL Server 2016列存储技术做实时分析

为了解决OLAP场景的查询分析,微软从SQL Server 2012开始引入列存储技术,大大提高了OLAP查询的性能;SQL Server 2014解决了列存储表只读的问题,使用场景大大拓宽;而SQL Server 2016的列存储技术彻底解决了实时数据分析的业务场景。用户只需要做非常小规模的修改,便可以可以非常平滑的使用SQL Server 2016的列存储技术来解决实时数据分析的业务场景。这一节讨论以下几个方面:

  • SQL Server 2016数据分析架构

  • Disk-based Tables with Nonclustered Columnstore Index

  • Memory-based Tables with Columnstore Index

  • Minimizing impacts of OLTP

SQL Server 2016数据分析架构

SQL Server 2016数据分析架构相对于传统的RDBMS数据分析架构有了非常大的改进,变得更加简单。具体体现在OLAP直接接入OLTP数据源,如此就无需Data Warehouse角色和ETL任务这个“搬运工”了。

OLAP直接接入OLTP数据源:让OLAP报表数据源直接接入OLTP的数据源头上。SQL Server会自动选择合适的列存储索引来提高数据分析查询的性能,实现实时数据分析的场景。

不再需要ETL任务:由于OLAP数据源直接接入OLTP的数据,没有了Data Warehouse角色,所以不再需要ETL任务,从而大大简化了数据处理流程中的各环节,没有了相应的开发维护和时间成本。
SQL Server 2016实时分析架构图,展示如下(图片来自微软培训教程):
02.png

SQL Server 2016之所以能够实现如此简化的实时分析,底气是来源于SQL Server 2016的列存储技术,我们可以建立基于磁盘存储或者基于内存存储的列存储表来进行实时数据分析。

Disk-based Tables with Nonclustered Columnstore Index

使用SQL Server 2016列存储索引实现实时分析的第一种方法是为表建立非聚集列存储索引。在SQL Server 2012版本中,仅支持非聚集列存储索引,并且表会成为只读,而无法更新;在SQL Server 2014版本中,支持聚集列存储索引表,且数据可更新;但是非聚集列存储索引表还是只读;而在SQL Server 2016中,完全支持非聚集列存储索引和聚集列存储索引,并且表可更新。所以,在SQL Server 2016版本中,我们完全可以建立非聚集列存储索引来实现OLAP的查询场景。创建方法示例如下:

DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
    OrderID BIGINT IDENTITY(1,1) NOT NULL
    ,AutoID INT NOT NULL
    ,UserID INT NOT NULL
    ,OrderQty INT NOT NULL
    ,Price DECIMAL(8,2) NOT NULL
    ,OrderDate DATETIME NOT NULL
	,OrderStatus SMALLINT NOT NULL
	CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED (OrderID)
) ;
GO

--Create the columnstore index with a filtered condition  
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder 
ON dbo.SalesOrder (OrderID, AutoID, UserID, OrderQty, Price, OrderDate, OrderStatus)
;
GO

在这个实例中,我们创建了SalesOrder表,并且为该表创建了非聚集列存储索引,当进行OLAP查询分析的时候,SQL Server会直接从该列存储索引中读取数据。

Memory-based Tables with Columnstore Index

SQL Server 2014版本引入了In-Memory OLTP,又或者叫着Hekaton,中文称之为内存优化表,内存优化表完全是Lock Free、Latch Free的,可以最大限度的增加并发和提高响应时间。而在SQL Server 2016中,如果你的服务器内存足够大的话,我们完全可以建立基于内存优化表的列存储索引,这样的表数据会按列存储在内存中,充分利用两者的优势,最大程度的提高查询查询效率,降低数据库响应时间。创建方法实例如下:


DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
    OrderID BIGINT IDENTITY(1,1) NOT NULL
    ,AutoID INT NOT NULL
    ,UserID INT NOT NULL
    ,OrderQty INT NOT NULL
    ,Price DECIMAL(8,2) NOT NULL
    ,OrderDate DATETIME NOT NULL
	,OrderStatus SMALLINT NOT NULL
	CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED HASH (OrderID) WITH (BUCKET_COUNT = 10000000)
) WITH(MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA) ;
GO

ALTER TABLE dbo.SalesOrder
	ADD INDEX CCSI_SalesOrder CLUSTERED COLUMNSTORE
;
GO

在这个实例中,我们创建了基于内存的优化表SalesOrder,持久化方案为表结构和数据;然后在这个内存表上建立聚集列存储索引。当OLAP查询分析执行的时候,SQL Server可以直接从基于内存的列存储索引中获取数据,大大提高查询分析的能力。

Minimizing impacts of OLTP

考虑到OLTP数据源的高并发,低延迟要求的特性,在某些非常高并发事务场景中,我们可以采用以下方法最大限度减少对OLTP的影响:

  • Filtered NCCI + Clustered B-Tree Index

  • Compress Delay

  • Offloading OLAP to AlwaysOn Readable Secondary

Filtered NCCI + Clustered B-Tree Index

带过滤条件的索引在SQL Server产品中并不是什么全新的概念,在SQL Server 2008及以后的产品版本中,均支持创建过滤索引,这项技术允许用户创建存在过滤条件的索引,以加速特定条件的查询语句使用过滤索引。而在SQL Server 2016中支持存在过滤条件的列存储索引,我们可以使用这项技术来区分数据的冷热程度(数据冷热程度是指数据的修改频率;冷数据是指几乎或者很少被修改的数据;热数据是指经常会被修改的数据。比如在订单场景中,订单从生成状态到客户收到货物之间的状态,会被经常更新,属于热数据;而客人一旦收到货物,订单信息几乎不会被修改了,就属于冷数据)。利用过滤列存储索引来区分冷热数据的技术,是使用聚集B-Tree索引来存放热数据,使用过滤非聚集列存储索引来存放冷数据,这样SQL Server 2016的优化器可以非常智能的从非聚集列存储索引中获取冷数据,从聚集B-Tree索引中获取热数据,这样使得OLAP操作与OLTP事务操作逻辑隔离开来,最终OLAP最大限度的减少对OLTP的影响。

下图直观的表示了Filtered NCCI + Clustered B-Tree Index的结构图(图片来自微软培训教程):

03.png

实现方法参见以下代码:

-- create demo table SalesOrder
DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
    OrderID BIGINT IDENTITY(1,1) NOT NULL
    ,AutoID INT NOT NULL
    ,UserID INT NOT NULL
    ,OrderQty INT NOT NULL
    ,Price DECIMAL(8,2) NOT NULL
    ,OrderDate DATETIME NOT NULL
	,OrderStatus SMALLINT NOT NULL
	CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED (OrderID)
) ;
GO
/*
— OrderStatus Description
— 0 => ‘Placed’ 
— 1 => ‘Closed’
— 2 => ‘Paid’
— 3 => ‘Pending’
— 4 => ‘Shipped’
— 5 => ‘Received’
*/

CREATE CLUSTERED INDEX  CI_SalesOrder 
ON dbo.SalesOrder(OrderStatus)
;
GO
 
--Create the columnstore index with a filtered condition  
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder 
ON dbo.SalesOrder (AutoID, Price, OrderQty, orderstatus)  
WHERE orderstatus = 5  
;  
GO

在这个实例中,我们创建了SalesOrder表,并在OrderStatus字段上建立了Clustered B-Tree结构的索引CI_SalesOrder,然后再建立了带过滤条件的非聚集列存储索引NCCI_SalesOrder。当客人还未收到货物的订单,会处于前面五中状态,属于需要经常更新的热数据,SQL Server查询会根据Clustered B-Tree索引CI_SalesOrder来查询数据;客人已经收货的订单,处于第六种状态,属于冷数据,SQL Server查询冷数据会直接从非聚集列存储索引中获取数据。从而最大限度减少对OLTP影响的同时,提高查询效率。

Compress Delay

如果按照业务逻辑层面很难明确划分出数据的冷热程度,也就是说很难从过滤条件来逻辑区分数据的冷热。这种情况下,我们可以使用延迟压缩(Compress Delay)技术从时间层面来区分冷热数据。比如:我们定义超过60分钟的数据为冷数据,60分钟以内的数据为热数据,那么我们可以在创建列存储索引的时候添加WITH选项COMPRESSION_DELAY = 60 Minutes。当数据产生超过60分钟以后,数据会被压缩存放到列存储索引中(冷数据),60分钟以内的数据会驻留在Delta Store的B-Tree结构中,这种延迟压缩的技术不但能够达到隔离OLAP对OLTP作用,还能最大限度的减少列存储索引碎片的产生。
实现方法参见以下例子:

-- create demo table SalesOrder
DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
    OrderID BIGINT IDENTITY(1,1) NOT NULL
    ,AutoID INT NOT NULL
    ,UserID INT NOT NULL
    ,OrderQty INT NOT NULL
    ,Price DECIMAL(8,2) NOT NULL
    ,OrderDate DATETIME NOT NULL
	,OrderStatus SMALLINT NOT NULL
	CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED (OrderID)
) ;
GO

--Create the columnstore index with a filtered condition  
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder 
ON dbo.SalesOrder (AutoID, Price, OrderQty, orderstatus)  
WITH(COMPRESSION_DELAY = 60 MINUTES)
;  
GO

SELECT name
		,type_desc
		,compression_delay 
FROM sys.indexes
WHERE object_id = object_id('SalesOrder')
	AND name = 'NCCI_SalesOrder'
;

检查索引信息截图如下:
04.png

Offloading OLAP to AlwaysOn Readable Secondary

另外一种减少OLAP对OLTP影响的方法是利用AlwaysOn只读副本,这种情况,可以将OLAP数据源从OLTP剥离出来,接入到AlwaysOn的只读副本上。AlwaysOn的主副本负责事务处理,只读副本可以作为OLAP的数据分析源,这样实现了OLAP与OLTP的物理隔离,将影响减到最低。架构图如下所示(图片来自微软培训教程):
05.png

一个实际例子

在订单系统场景中,用户收到货物过程,每个订单会经历6中状态,假设为Placed、Canceled、Paid、Pending、Shipped和Received。在前面5中状态的订单,会被经常修改,比如:打包订单,出库,更新快递信息等,这部分经常被修改的数据称为热数据;而订单一旦被客人接受以后,订单数据就几乎不会被修改,这部分数据称为冷数据。这个例子就是使用SQL Server 2016 Filtered NCCI + Clustered B-Tree索引的方式来逻辑划分出数据的冷热程度,SQL Server在查询过程中,会从非聚集列存储索引中取冷数据,从B-Tree索引中取热数据,最大限度提高OLAP查询效率,减少对OLTP的影响。
具体建表代码实现如下:

-- create demo table SalesOrder
DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
    OrderID BIGINT IDENTITY(1,1) NOT NULL
    ,AutoID INT NOT NULL
    ,UserID INT NOT NULL
    ,OrderQty INT NOT NULL
    ,Price DECIMAL(8,2) NOT NULL
    ,OrderDate DATETIME NOT NULL
	,OrderStatus SMALLINT NOT NULL
	CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED (OrderID)
) ;
GO
/*
— OrderStatus Description
— 0 => ‘Placed’ 
— 1 => ‘Closed’
— 2 => ‘Paid’
— 3 => ‘Pending’
— 4 => ‘Shipped’
— 5 => ‘Received’
*/

CREATE CLUSTERED INDEX  CI_SalesOrder 
ON dbo.SalesOrder(OrderStatus)
;
GO
 
--Create the columnstore index with a filtered condition  
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder 
ON dbo.SalesOrder (AutoID, Price, OrderQty, orderstatus)  
WHERE orderstatus = 5  
;  
GO

为了能够直观的看到利用SQL Server 2016列存储索引实现实时分析的效果,我虚拟了一个网络汽车销售订单系统,使用NodeJs + SQL Server 2016 Columnstore Index + Socket.IO来实现实时订单销量和销售收入的分析页面。详情参加Youku视屏:SQL Server 2016列存储索引实现实时数据分析

总结

这篇文章讲解利用SQL Server 2016列存储索引技术实现数据实时分析的两种方法,以解决传统RDBMS数据分析的高延迟、高成本的痛点。第一种方法是Hekaton + Clustered Columnstore Index;第二种方法是Filtered Nonclustered Columnstore Index + Clustered B-Tree。本文并以此理论为基础,展示了一个网络汽车在线销售系统的实时订单分析页面。

参考文章

Real-Time Operational Analytics: Filtered nonclustered columnstore index (NCCI)

Real-Time Operational Analytics: Memory-Optimized Tables and Columnstore Index

Real-Time Operational Analytics Using In-Memory Technology

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
存储 关系型数据库 OLAP
PgSQL · 应用案例 · PostgreSQL OLAP加速技术之向量计算
背景 在主流的OLTP数据库产品中,毫无疑问,PostgreSQL已经具备非常强大的竞争力(性能、功能、稳定性、成熟度、案例、跨行业应用等)。 通过这些文章我们可以了解更细致的情况。 《数据库十八摸 - 致 架构师、开发者》 《数据库界的华山论剑 tpc.org》 《PostgreSQL 前世今生》 在OLAP领域,PostgreSQL社区也是豪情万丈的,比如内核已经实现了基于CPU的多
7545 0
|
并行计算 关系型数据库 测试技术
PgSQL · 特性分析 · PostgreSQL 9.6 让多核并行起来
背景 经过多年的酝酿(从支持work process到支持动态fork共享内存,再到内核层面支持并行计算),PostgreSQL 的多核并行计算功能终于在2016年发布的9.6版本中正式上线,为PG的scale up能力再次拔高一个台阶,标志着开源数据库已经攻克了并行计算的难题。 相信有很多小伙伴已经开始测试了。 在32物理核的机器上进行了测试,重计算的场景,性能程线性提升。 目前并行计算支
5664 0
|
存储 SQL 机器学习/深度学习
MySQL · 内核特性 · 统计信息的现状和发展
简介我们知道查询优化问题其实是一个搜索问题。基于代价的优化器 ( CBO ) 由三个模块构成:计划空间、搜索算法和代价估计 [1] ,分别负责“看到”最优执行计划和“看准”最优执行计划。如果不能“看准”最优执行计划,那么优化器基本上就是瞎忙活,甚至会产生严重的影响,出现运算量特别大的 SQL ,造成在线业务的抖动甚至崩溃。在上图中,代价估计用一个多项式表示,其系数 c 反应了硬件环境和算子特性,而
332 0
MySQL · 内核特性 · 统计信息的现状和发展
|
存储 缓存 NoSQL
PgSQL · 引擎介绍 · 向量化执行引擎简介
摘要 本文为大家介绍一下向量化执行引擎的引入原因,前提条件,架构实现以及它能够带来哪些收益。 希望读者能够通过对这篇文章阅读能够对向量化执行引擎的应用特征与架构有一个概要的认识。 关键字 向量化执行引擎, MonetDB,Tuple, 顺序访问,随机访问, OLAP, MPP,火山模型,列存表,编译执行 背景介绍 过去的20-30年计算机硬件能力的持续发展,使得计算机的计算能力飞速提升。然后
5854 1
|
SQL 监控 Go
MSSQL · 应用案例 · 日志表设计优化与实现
摘要 这篇文章从日志表问题引入、日志表的共有特性、日志表的设计需求、设计思路以及设计详细实现的角度,阐述了在SQL Server数据库中如何最优化设计日志表来降低系统资源的占用和提高系统吞吐量。问题引入 在平时与客户服务与交流过程中,我们不止一次的被客人问及这样的场景:我们现在面临如何设计SQL Server日志表方案,如何最优化设计数据库日志记录表。
1544 0
|
存储 关系型数据库 MySQL
MySQL · 特性介绍 · 一些流行引擎存储格式简介
1 概述 本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析 InnoDB InnoDB 底层存储结构为B+树,结构如下 B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k。
1991 0
|
SQL 关系型数据库 索引
HybridDB · 最佳实践 · HybridDB 数据合并的方法与原理
引言 刚开始使用HybridDB的用户,有个问的比较多的问题:如何快速做数据“合并”(Merge)?所谓“合并”,就是把数据新版本更新到HybridDB中。如果数据已经存在,则将它们替换为新版本;如果不存在,将它们插入数据库中。一般是离线的做这种数据合并,例如每天一次批量把数据更新到HybridDB中。也有客户需要实时的更新,即做到分钟级甚至秒级延迟。这里我们介绍一下HybridDB中数据合并的
3017 0
|
SQL 数据挖掘 关系型数据库
PgSQL · 特性分析· JIT 在数据仓库中的应用价值
背景 近几年,分析型数据库中有项技术得到了广泛的应用。它就是 JIT(Just-in-time compilation)动态编译。还有一些相关名词 LLVM codegen 和这项技术相关。本文把这项技术做一个简单的分析,和大家分享。 一、JIT 是什么 长久以来数据仓库都是以高效的处理量数据的能力著称。随着硬件的发展,他们使用大量相关技术充分挖掘硬件的能力提高数据的吞吐量和处理效率。例如 SM
1581 0
|
关系型数据库 MySQL 索引
MySQL · 特性分析 · 5.7 代价模型浅析
代价模型 mysql 5.7代价计算相对之前的版本有较大的改进。例如 代价模型参数可以动态配置,可以适应不同的硬件 区分考虑数据在内存和在磁盘中的代价 代价精度提升为浮点型 jion计算时不仅要考虑condition,还要考虑condition上的filter,具体参见参数condition_fanout_filter 5.7 在代价类型上分为io,cpu和memory, 5.7
1815 0
|
JSON 关系型数据库 MySQL
MySQL · 特性分析 · 直方图的实现与分析
直方图(Histogram)是 RDBMS 中提供的一种基础的统计信息,最典型的用途是估计查询谓词的选择率,以便选择优化的查询执行计划。常见的直方图种类有:等宽直方图、等高直方图、V-优化的直方图,MaxDiff 直方图等等。RDBMS 产品最初使用的直方图非常简单(只有一个桶),后来逐步演化到等宽直方图、等高直方图等。MariaDB 10.0.2 就已在 server 层实现了直方图功能,参考T
2557 0