DB2的列式存储技术在db210.5版本中被引进如db2内核之中。该技术是为了应对数据仓库及数据集市在数据量暴涨的时代提高数据处理的效率。其借鉴了NoSQL即时处理海量数据的思想。该技术的内部代号为BLU但它并不是首字母缩的略词,它其实是一个内部项目名称不过我们可以使用 Big Data、Lightning Fast 和 Ultra Easy来代表BLU的缩写。企业通过利用 DB2 BLU 及其创新性压缩技术可以实现的存储成本节约。BLU基于评估、联接和分组等复杂操作会尽可能多地处理压缩数据,尽可能晚地解压缩可实现有效的查询执行和有效的内存利用率,从而通过各种工作负载产生 10 倍到 25 倍甚至更多的性能收益。该技术结合了分析工作负载的前所未有的存储节约和性能加速的易用性。本文将着重介绍BLU 技术背后的创新性内存、CPU 和 I/O 优化的实现原理、方法论及最佳实践。
一、构成 BLU Acceleration 技术的核心理念包括:
1. 易用性:BLU Acceleration 被设计为非常简单易用。根据 DBA 的观点,您只需装入并执行即可,不需要创建二级对象(比如索引或 MQTs)来提高查询性能。BLU Acceleration 为分析工作负载提供很好的开箱即用性能。
2. 按列组织的表(column-organized table):按列组织的表将会存储磁盘上单独一组页面的每一列。在磁盘上按照列组织数据可以减少处理查询所需的 I/O 数量,因为只需要访问查询中引用的列。柱状构造(columnar organization)支持从列子集中访问大量值,并频繁地使用聚合和联接(join)的分析查询。只有处理查询所需的列数据才会从磁盘加载到内存中。通过尽可能晚地实现列的具体化,BLU 可以充分利用根据谓词执行的筛选,产生大量的 I/O 节约。最后,与其他供应商不一样,在可以开始执行 SQL 之前,BLU 并不需要将所有活动数据都加载到内存中。
3. 可行性压缩:使用有效的压缩算法可以自动压缩按列组织的表。与传统的数据库压缩技术相比,这一项业界领先的压缩技术可以产生大量的存储节约。DB2 查询处理引擎能够在压缩数据上评估预测,并执行复杂操作,比如联接和聚合。这有助于提高查询性能并允许有效地利用内存,因为它可以将更多的压缩数据存储在内存中。
4. 数据忽略(data skipping):DB2 忽略了对实现某个查询不必要的列值的读数范围。数据忽略利用一个称为概要表的小型数据结构。概要表会针对列组织自动创建并维护,而且不需要使用任何配置或维护。
5. 优化的 CPU:如果硬件提供了优化的 CPU,那么 BLU 将会利用单指令多数据 (single instruction multiple data, SIMD) 处理。SIMD 支持将相同的指令应用到硬件级别中的多个并行数据段中。此外,BLU 算法旨在随着系统中可用核心的数量进行缩放。
6. 扫描友好型内存缓存:大量压缩、数据忽略和延迟具体化,这些意味需要更少的数据来处理查询。当内存中无法完全处理查询并且需要使用 I/O 时,BLU 就会利用针对扫描优化的内存缓存算法来减少从磁盘中读取特定页面的次数。
7. 无缝集成:BLU Acceleration 被完全集成到 DB2 中。这意味着无需考虑表组织,您的应用程序就可以使用相同的 SQL 界面、备份和恢复脚本,以及您熟悉的 LOAD 和 EXPORT 命令。
二、适用于 BLU 的理想工作负载特征
BLU Acceleration 特性用于分析或数据集市工作负载。这些工作负载通常包含普通的报告查询,以及无法提前调优的专用商业智能查询。如果您的工作负载主要是事务处理,那么您可能会要考虑使用按行组织的表。下表识别了一些适合于按列组织的表的工作负载特征,以及适合于按行组织的表的一些特征:
表 1. 基于工作负载属性的表组织
使用按列组织的表 | 使用按行组织的表 |
分析工作负载,数据集市 | 在线事务处理工作负载 |
包含分组、聚合、范围扫描或联接的查询 | 访问单一行或少数行的查询 |
访问表的子集、列的查询 | 在单一事务中插入或更新少于 100 行的应用程序 |
基于星型模式的数据库设计 | 访问表中的大多数列或所有列的查询 |
SAP Business Warehouse 应用程序 | 使用表中的 XML、时态或 LOB 数据的应用 |
三、系统规模调整指南
DB2 BLU Acceleration 的设计与 SIMD(Single Instruction Multiple Data,单指令多数据)、多核心并行利用和要处理的数据量有关,支持较大的核心计数。BLU 算法旨在有效地利用大容量内存配置。
BLU配置最佳实践:
1. 对于生产方面的使用,建议最少提供 8 个核心和 64GB RAM。
2. 随着系统规模的扩大,确保 BLU 在每个核心上至少有 8 GB 的主内存。
3. 考虑在 I/O 子系统上存储按列组织的表,这些子系统可以展示任意出色的 I/O 特征,尤其在活动表数据超过内存大小时。
4. 随着数据量的增长和查询复杂度的提高,您的 BLU 加速的工作负载将从大量核心和更多内存中获益。
四、创建和填充按列组织的表的方法
在本节中,我们将介绍如何创建新按列组织的表,或者如何将现有按行组织的表转换为按列组织的表。如果数据库是通过 DB2_WORKLOAD=ANALYTICS 配置的,那么新创建的表默认情况下是按列组织的表。在创建按列组织的表之前,需要确保工作负载的特征符合 适用于 BLU 的理想工作负载特征 一节中讨论的属性。Optim Query Workload Tuner (OQWT) 可用于识别可能是按列组织的表优秀候选表的表。根据最新建议,您可以使用下列其中一种方法选择创建部分或全部表作为按列组织的表:
方法 1:CREATE TABLE 和 LOAD
利用相同的 DDL 将新表创建为按行组织的表,并将表数据加载到新表中:
create table sales_col (tid bigint not null, saledate date,saleprice decimal(12,2)) in col_tbsp organize by column
如果数据库配置参数 DFT_TABLE_ORG 被设置为 COLUMN,那么可以选择 ORGANIZE BY COLUMN 子句,当数据库被配置为用于分析时,会出现这种情况。要想在这样的数据库中创建按行组织的表,可以指定 ORGANIZE BY ROW 子句。
load from sales.del of del replace into sales_col
除了加载表数据外,这种初始加载还会自动构建柱状压缩字典、概要表和收集统计信息。要想实现最佳压缩,我们建议加载足够的数据(数个千兆字节),这些数据中包含最具代表性的数据值子集。
方法 2:将按行组织的表转换为按列组织的表
使用 db2convert 命令将数据库中的一个或全部按行组织的表转换为按列组织的表。按行组织的表在转换期间仍然保持在线状态。db2convert 命令调用 ADMIN_MOVE_TABLE 存储程序。这项转换只是单向操作,所有一定要备份数据库或表空间。
db2convert –d edwdb –z blu –t sales -ts col_tbsp
将 edwdb 数据库中的 blu.sales 表从按行组织的表转换为按列组织的表。请注意,-z 选项指定了表的模式,-ts 选项指定了创建按列组织的表的表空间。
db2convert –d edwdb
将 edwdb 数据库中的所有表转换为按列组织的表。一旦转换成功,db2convert 将返回:
SQL2446I,db2convert 命令已成功完成。满足指定匹配标准的所有按行组织的表都已转换成为按列组织的表。
参阅 此处,了解有关 db2convert 的更多详细信息。
方法 3:Workload Table Organization Advisor
OQWT 可用于识别可能会成为最佳按列组织的表候选表的表。OQWT 的建议是以表统计信息和查询工作负载特征为基础的。它甚至可以表示工作负载中查询的预期性能改进。在 OQWT 对可能从列组织中获益的表提出建议后,您就可以决定是否希望执行该工具生成的脚本来实施给出的建议。做出这些更改之前,请务必备份数据库
五、常见问题解答
在利用按列组织的表继续测量压缩节约和性能改进之前,需要讨论一些在此阶段中经常会出现的问题。
Q:DB2_WORKLOAD=ANALYTICS 的内部秘诀是什么?
A:该设置背后的理念是提供一种简单的方法来配置分析工作负载的数据库。通过这一设置,除了其他方面之外,新创建的表默认情况下都是按列组织的表,内部查询并行性启用,计算 SORTHEAP 和 SHEAPTHRES_SHR 等排序参数,实用程序堆 (UTIL_HEAP_SZ) 经过配置后可将数据加载到按列组织的表中,并启用工作负载管理并发阈值。如果在此设置之后创建的数据库有效,那么默认数据库页大小被设置为 32K,而默认范围大小被设置为 4 页。
Q:我有一个现有的数据库。我是否仍然可以从 DB2_WORKLOAD=ANALYTICS 提供的一键式调优中获益?
A:是的。设置好 DB2_WORKLOAD=ANALYTICS 之后,运行 AUTOCONFIGURE 命令从所配置的设置中获取最大收益。在表空间创建期间,因为数据库级设置很有可能会有所不同,所有需要显式指定 32K 页大小和 4 页的范围大小。为了避免在每个表空间创建时指定范围大小,可以将 DFT_EXTENT_SZ 更新为 4。
Q:我听说 BLU 推荐使用 DB2_WORKLOAD=ANALYTICS,但如果将我的 SAP BW 环境的 DB2_WORKLOAD 设置为 SAP 会怎么样?
A:为了避免对您的 SAP BW 应用程序环境产生任何影响,请继续将 DB2_WORKLOAD 设置为 SAP 并手动配置分析数据库,如 此处 所述。
Q:我如何验证哪些表是按行组织的表,哪些表是按列组织的表?
A:查询 syscat.tables 目录视图的 TABLEORG 列来验证某个表是按行组织的表 (TABLEORG=R) 还是按列组织的表 (TABLEORG=C):
select tableorg from syscat.tables where tabname='SALES'
Q:我如何递增地刷新按列组织的表中的表数据?
A:根据表的可用性需求,您可以通过 INGEST 实用程序或 LOAD 与 INSERT 选项,向现有按列组织的表中添加新数据。INGEST 实用程序允许通过目标表上持续的 SQL 活动实现更大的并发性,这对于满足数据仓库中持续和实时数据刷新等特定需求至关重要。如果使用 IMPORT, INGEST 或 INSERT,建议在每个事务中插入大于 1000 的行来分摊日志记录和其他开销。
Q:在初始 LOAD 之后加载的数据需要压缩吗?
A:是的, 通过 LOAD, INSERT, IMPORT 或 INGEST 操作以递增方式添加到表中的数据可使用初始 LOAD 操作创建的列级字典进行压缩。此外,BLU 还使用页级压缩来压缩可能不会在列级压缩字典中表示的新值。这个列级和页级压缩的双层方法是一种成熟的技术,可有效处理 “数据漂移(data drift)” 并避免随着时间的推移而使得压缩退化。