首页 / 新闻

01.

19

2016

【干货】业界最强的SQL引擎Inceptor为何这么快?Holodesk CUBE实现灵活的秒级十亿条数据汇总查询

技术博客

 

 

 

 

 

 

Figure 1 数据立方体

 

Data Cube(简称Cube),即数据立方体,用以表示具有多数列信息的数据集,如上图所示,Cube实际上是对抽象数据模型的空间式的解释,每个Cube都由维度(Dimension)和度量(Measure)两类集合构成。Cube中的每个单元内容对应着特定维度值下的度量值。

 

Cube用一种直观的方式展现了多维的数据集,使用户可以方便地从各个不同角度查看数据,各种cube操作则使用户可以灵活快速地对数据进行细分或者汇总,使数据可以更有效地为用户提供决策支撑。在OLAP中,聚合查询通过聚合函数通过来汇总(group by)来自多个行的信息。聚合函数非常常见,例如COUNT(计数)、AVG(平均数)、SUM(合计)等等,可见聚合查询的重要性。然而,聚合查询需要对全表进行扫描计算,所以速度非常慢。在Transwarp Data Hub平台上,我们则可以让Inceptor在建表阶段对Holodesk表建cube,收集聚合查询所需的信息,让查询时聚合速度大大提升。

 

我们用下面这张简单的表(连锁水果店的库存表)进行说明Inceptor为Holodesk表建cube的操作。“……”处为省略的表中数据,不影响理解。

 

 

Figure 2 水果店库存表

 

在建表时,如果我们执行指令为Time, Product和City列建Cube, 那么Inceptor会为这张表建一个抽象的数据立方,在其中记录下不同的(Time,  Product, City)数组所在的位置:

  

 

Figure 3 水果店库存表的cube

 

例如,在(2004,Apple,SH)的小方块中记录1,3,代表(Time, Product, City)=(2004, Apple,SH)的记录在第1.3行;在(2004, Orange, NJ)的小方块中记录2,4,5则代表Time, Product, City)=(2004, Orange, NJ) 的记录在第2,4,5行,以此类推。(这里对Figure 3做两点说明:1. Time为2005年和2006年的记录由于平面图像限制,在这里不做展示,在实际的数据立方中,Inceptor则会记录相应信息。2. 图中,我们在没有对应记录的小方块中标注了“NA”,而在实际操作中,Inceptor则不作任何记录。)拥有这样的信息后,Inceptor在对Time, Product, City列进行聚合时,无需再去扫描整张表,而是可以“按图索骥”,通过所建的cube,直接定位到需要聚合的数据,大大减少了查询耗时。同时,建高维cube是一举多得的——拥有高维的cube可以轻松地降维,比如在本例中,对(Time, Product, City)建好的cube可以用于加速对这三列中的任意一列或两列的聚合查询。

 

传统cube的核心思想是“预计算”——在建cube时就预先计算聚合函数值,这样在查询中可以直接获取现成的计算结果。这样的cube能够提升查询速度,但是缺乏灵活性,因为它只能提供指定维度上的指定聚合函数值,不仅对超出指定范围的聚合函数无能为力,还无法降维。Holodesk cube则采用了完全不同的策略,通过记录聚合维度的位置,可以为任意聚合函数加速,还可以轻松降维。

 

下面,我们进行一个简单的案例演示,看看对Holodesk表建cube后的性能提升。案例中,我们将用到TPC-DS中的store_sales表,表中有十四亿条左右的数据。我们将在以下情况下对store_sales执行一次对两个维度聚合的查询:

 

1. store_sales表为TXT表;

2. store_sales表为Holodesk表并建cube;

将要执行的SQL语句为:

SELECT COUNT(*) FROM store_sales GROUP BY ss_item_sk, ss_sold_date_sk;

 

1. Store_sales表为TXT表:

 

通过管理界面(如下图所示),我们看到对TXT格式的store_sales表的执行分为了两个阶段,总耗时为167秒左右。

 

 Figure 4 store_sales表为TXT表

 

 

2. Store_sales表为Holodesk表并建CUBE:

 

因为执行的SQL语句对ss_store_sk和ss_quantity两列进行聚合,所以我们在建表时对这两列建cube,建表语句如下:

 

这里 'holodesk.dimension' = ‘ss_store_sk, ss_quantity’指定了对ss_store_sk和ss_quantity建cube。建表完成后对store_sales_cube做查询。通过管理界面(如下图所示),我们看到对store_sales_cube表的执行耗时为11秒,查询性能相对TXT表提升了15倍。

 

Figure 5 Store_sales_cube表为建cube的holodesk表

 

在聚合查询中,对Holodesk表建cube能做到非常显著的性能提升。在聚合查询之外,对多表的关联查询(JOIN)是SQL查询中的另一大难点,由于涉及到多张表,处理的数据量和复杂度都大大提高了。下期,我们将介绍如何利用Holodesk表特性在多表关联查询中获得大幅性能提升。