在 DB2 V10.5 之前,DB2 在物理实现上一直是基于行存储,但在典型的数据仓库应用中,由于读操作的频率(查询、连接、聚集等)会远大于写操作(增删改),这种存储实现方式并不能给数据仓库、实时分析带来显著的优势。
近些年来列存储数据库以其读磁盘效率,存储空间的可压缩比率,排序 / 索引效率,以及由此带来的技术、管理和应用优势,成为了数据仓库应用的一大热点。
DB2 V10.5 正是在这一背景下应运而生,这也使得构建基于列存储的数据仓库成为可能。这篇文章将介绍使用 DB2 Warehouse V10.5 时,构建列存储数据仓库的一系列最佳实践,并且穿插阐述了数据仓库数据流设计时的一些细节处理。
准备活动为了演示后续的用户场景,首先我们在 DB2 V10.5 上创建名为 BLUTEST 的数据库,并分别建立两个行存储,两个列存储的表:
清单 1. preparation ddl建完之后,为了在 Design Studio 中使用这个数据库,需要将其反向工程为本地的数据模型文件(.dbm 文件)。具体步骤此处省略。
场景一:将文件内容装载至列存储表在很多数据仓库的应用场景下,中间数据(例如从 OLTP 数据中转换并导出)会以文件形式保存,然后再将其直接导入数据仓库表中。此场景将介绍如何将文件内容装载至列存储表。
首先创建一个数据流,并拖拽“文件源”操作符至数据流编辑器中,其中抽取方法有三种选项:
这三种方式均能正确将文件内容装载至列存储表,这里我们采取默认的 DB2 LOAD 方式。
接着指定该文件在客户机的位置。(注意:若选择“数据库服务器”选项,则意味着文件需存在于此数据流的 SQL 执行数据库上)
图 1. 文件源操作符点击“下一步”,此处需要指定文件各字段的列名与数据类型——既可手工输入,也可通过“生成文件格式”等其他方式自动生成。接着点击“完成”,这样对一个源文件的定义就完成了。
接下来在选择目标表的操作符时,有两个选择:
其具体区别在于运用场景不同:
成批装入目标会直接使用 DB2 的 Load 命令直接导入数据,这是速度上是最优的。而表目标适合的场景更灵活,会根据目标表的类型生成不同的 SQL。例如若目标表不在 SQL 执行数据库上,那最终的执行方式会是 JDBC;若会需要也会生成一个不记日志的临时表作为中转需要。 而对于将文件内容装载至列存储表这类场景,我们推荐使用文件源 -> 成批装入目标的操作符组合。
场景二:将任意数据流的阶段性输出导向列存储表上一场景中,文件其实代表了“暂存”的数据,即我们手工地把这些数据以文件的格式保存到了本地。而在典型的 ETL(数据的抽取,转换,装载)流程中,这一过程是不需要人工干预,而且需要比持久化文件更好的解决方案。
一个典型的数据仓库 ETL 流需要将业务表中(通常在 OLTP 数据库中)的数据与维度表进行键查询,然后装载至目标的事实表中,如下图所示:业务表 1 为 行存储的业务表 ROW.AROMA_CLASS,表源 2 为 列存储的维度表 CDE.AROMA_CLASS。
图 2. 典型 ETL 流示例此处,表目标也可以替换成成批装入目标操作符。下面我们简单对比一下二者的执行 SQL 代码 >
执行方式:DB2 的 SYSPROC.ADMIN_CMD 存储过程
清单 2. 成批装入目标生成代码执行方式:JDBC
清单 3. 表目标生成代码可以看出二者的执行 SQL 代码基本相似,区别在于:
在 场景二中,事实表 1 是已经创建好的列存储表,而在 DB2 Warehouse V10.5 所支持的数据仓库设计场景中,其实这个表是可以随着开始的进程动态创建的,而所用的功能就是“创建合适的表”。
假设我们暂时没有这个基于列存储的事实表,只有业务表和维度表两个源表,然后经过了键查询,并剔除掉无用列,修改列类型,或重命名一些列后,得到这个事实表需要的列名,列类型。那么很然想到的下一步动作应该就是执行相应的 db2 create 语句,即在数据库上手工创建这个表。然而使用 创建合适的表可以很方便在同时在 db2 和数据模型中创建这个即时需要的表,具体步骤是在键查询操作符的 相匹配端口上 右键 > 创建合适的表 ... > 填写合适的表名 > 选择数据库连接,然后会看下如下界面:
图 3. 创建合适的表在 Columns 页,创建此表的所有列信息是从键查询操作符的“相匹配”端口传递过来的,其他页的信息采用了默认值,均可手工修改。对于列存储来说,最重要的是信息是表组织项,需要在此选择“列”值。
接着点击“完成”即可同时在数据库和数据模型中创建这个即时需要的表。
这种场景同时可以应用于所有有输出端口的操作符上,如表源,文件源,渐变维等等。
场景四:优化行存储表及列存储表间的数据抽取,转换,装载DB2 Warehouse V10.5 作为数据仓库的端到端完整解决方案,其对于列存储表的最大优势在于其延续了高质量的代码生成技术——用户不必考虑行存储表与列存储表在之间在数据抽取,转换,装载时的各种考量,可能的性能消耗,这些都由内部基于查询图模型(Query Graph Model)的代码生成技术来完成。对于用户来说,只需要考虑端到端的表类型选择,中间的过程对于其是透明的。
场景二的优化后查询图模型如下图所示:
图 4. 优化后的查询图模型场景五:各操作符对于列存储表的细节调整及限制由于 DB2 Warehouse 产品是建立在 DB2 之上的,所以 DB2 V10.5 中列存储表的一些限制也直接或间接地反映到了 DB2 Warehouse 上。下面将以操作符为序,介绍其对于列存储表的细节调整及限制:
准备和清除页中,原先默认的 SET INTEGRITY 语句会被设置为空。
图 5. 成批装入目标高级选项 > 恢复选项,「使用保存的输入数据副本来恢复到目录中」选项对于列存储表不可用,故会收到如下错误:
图 6. COPY YES 出错信息高级选项页中,REORG 和 NOT LOGGED INITIALLY 选项将不可用。
图 7. 表目标操作符高级选项若站类型为常规表,INDEX 和 NOT LOGGED INITIALLY 选项将不可用。
图 8. 数据站选项这两个操作符因为生成的 SQL 代码中会使用 MERGE 语法,而其暂时在 DB2 V10.5 的列存储表中不支持,故这两个操作符暂时不能作用于列存储表。
重组操作符若作用于列存储表,会出现如下错误:
图 9. 重组操作符出错信息从行存储到列存储,DB2 V10.5 在物理实现的改变,使得数据仓库的性能从理论上得到了极大的提高。希望本文阐述的几个典型用户场景,能使读者能在如何使用 DB2 Warehouse V10.5 进行基于列存储的数据仓库的设计方面有所启发和收获。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论