atpeace331
作者atpeace331·2019-06-19 14:26
数据库管理员·银行

浅析 Data Skipping 技术 for DB2 BLU

字数 1493阅读 1631评论 0赞 3

y1updqm8x7

y1updqm8x7

“列组织表”的 Data Skipping 技术可以有效地大幅度减少数据读取 IO,大幅提升性能。但是,信息中心中对它的介绍很少,脑子中的一连串问题需要解答。

“它和 行组织表 减少数据 IO的技术有什么不同呢?”

“是否也存在类似行表索引那样,可以检索列数据的目录字典?”

“ Data Skipping是如何工作的呢?”

一通补习后,终于弄清楚了这几件事儿,下面通过一个对产品销售量的统计来讲讲这几个问题的答案。

先看产品表的定义。

产品表:常规的行组织表 products_row1,列组织表 products_col1,它们的初始数据都是一样的

表定义如下:

products_row1(SALES int,SALE_DATE date)
索引:IDX_SALE_DATE ( SALE_DATE )

products_col1 (SALES int,SALE_DATE date)

1、通过下面的 sql 查询 products_row1 表中 2018年8月的销售量:

SELECT SUM(SALES) FROM products_row1 WHERE SALE_DATE BETWEEN '2018-08-01' AND '2018-08-31' ;

上面的普通行表的范围查询是通过定界扫描索引 IDX_SALE_DATE 来筛选符合查询条件的数据,间接地跳过了不必要的数据 (skipping rows)。行组织表的索引保存着相应记录对应的 RID(record ID),RID中保存着数据行在表空间中的 page number 与 slot number,通过他们可以直接定位查到对应的记录。

行表、索引、记录的逻辑结构见下图:

jd3aj476eke

jd3aj476eke

上面的例子中,我们看到了行表是通过相应的索引来“跳过”不符合查询条件的数据的,但是这需要 DBA事先根据业务查询创建合适的索引并定期进行维护。

2、下面查询 列组织表 统计2018年8月的销售量的 sql 语句又是如何 skipping data 的呢?

SELECT SUM(SALES) FROM products_col1 WHERE SALE_DATE BETWEEN '2018-08-01' AND '2018-08-31' ;

在创建每一个列组织表时,DB2 都会自动创建一个与之相关联的存放维护元数据的列组织表,“概要表”。每1024行数据,DB2 会统计基表每个列的最大值、最小值,并将其存储到“概要表”中。每当新的数据插入或更新到基表中,DB2会自动维护“概要表”使其与基表保持一致。

列组织表:
products_col1 (SALES int,SALE_DATE date)

概要表:

TSN_MinTSN_MaxSALE_DATE_MinSALE_DATE_Max
0102401/01/201806/30/2018
1024204807/25/201809/01/2018
2048307209/14/201812/11/2018

。。。。。。
。。。。。。

上面的统计查询,DB2会先查询“概要表”中哪些数据在查询范围内( '2018-08-01' 与 '2018-08-31' 之间),这样就像行表的索引那样完成了 data skipping,而“概要表”中的 TSN有点类似索引中的 RID,保存这相应数据的地址指针,通过它可以访问实际的数据。

这样 Data Skipping 就避免了不必要的 I/O。

本篇文章只是抛砖引玉,希望大家能深入思考、积极讨论,让更有价值的知识在论坛传播学习!

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

X社区推广