“列组织表”的 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,通过他们可以直接定位查到对应的记录。
行表、索引、记录的逻辑结构见下图:
上面的例子中,我们看到了行表是通过相应的索引来“跳过”不符合查询条件的数据的,但是这需要 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_Min | TSN_Max | SALE_DATE_Min | SALE_DATE_Max |
---|---|---|---|
0 | 1024 | 01/01/2018 | 06/30/2018 |
1024 | 2048 | 07/25/2018 | 09/01/2018 |
2048 | 3072 | 09/14/2018 | 12/11/2018 |
。。。。。。
。。。。。。
上面的统计查询,DB2会先查询“概要表”中哪些数据在查询范围内( '2018-08-01' 与 '2018-08-31' 之间),这样就像行表的索引那样完成了 data skipping,而“概要表”中的 TSN有点类似索引中的 RID,保存这相应数据的地址指针,通过它可以访问实际的数据。
这样 Data Skipping 就避免了不必要的 I/O。
本篇文章只是抛砖引玉,希望大家能深入思考、积极讨论,让更有价值的知识在论坛传播学习!
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞3
添加新评论0 条评论