前言
在数据仓库领域中,无论是在生产系统中,还是 POC(Proof Of Concept) 性能测试,查询性能对于客户来说都是非常重要的性能指标。良好的查询性能 为各类数据仓库应用的高效作业奠定了基础。而对于查询性能来说,众所周知, 其主要性能瓶颈来自于系统 I/O,因此本文从数据仓库物理设计的角度出发, 阐述了影响查询性能的三项关键技术,并以基准测试 TPC-H 进行了实例演示, 展示性能提升的效果。
关于分区数据库,表分区和多维集群(MDC),developerWorks 上已经有 很多优秀的文章对其基本原理和特点分别进行了阐述,本文将不再赘述。本文 重点关注该三项技术在物理设计方面对查询性能的影响。
理论依据
分区数据库(Database Partitioning Feature)
分区数据库中的 Share-Nothing 架构,将繁重而又耗时的系统 I/O 作业平均分配到集群中的各个节点,结合 SAN(Storage Area Network)存储 网络,能够充分利用磁盘控制器的 I/O 性能以及存储网络的带宽。
为了能够平衡各节点的 I/O 繁忙程度,均衡的数据分布,就显得尤为重要。 数据的分布情况取决于数据本身以及数据库分区键的选择,数据库分区键的 选择应遵循以下原则:
1. 唯一数值较多、较分散的列;
2. 经常用于联结(JOIN)的列;
在数据均衡分布的情况下 , 才能避免某一节点因处理过多数据造成 I/O 过度 繁忙从而成为整个集群的瓶颈。
在单机数据库环境下,查询的处理只能利用单机中的系统资源(CPU, Memory,I/O),当数据存储在单张大表时,BI(Business Intelligence) 查询通常需要访问表中的大部分数据,如对于查询 sql1 来说,在单机环境下, 数据的物理分布如图 1 所示。在没有创建索引的情况下,数据库需要扫描整张 大表来查询符合条件的记录,不难想象扫描大表所需要的繁忙 I/O 对查询整体 性能的影响。
清单 1. 查询 sql1
1 2 3 |
SELECT C_NAME, C_TOTAL_SPEND, C_LOYALTY_TIER from CUSTOMER where C_REGION = ‘ North America ’ AND C_MONTH= ‘ March ’ AND C_TYPE= ‘ VIP ’ |
(注:蓝色三角形代表符合查询条件的数据,即 C_REGION= ‘ North America ’ AND C_MONTH= ‘ March ’ AND C_TYPE= ‘ VIP ’)
图 1. 单机数据库环境中数据的物理分布
采用多分区数据库,可以将数据均衡地分布于集群中的各节点,虽然 BI 查询 仍需要扫描整张大表、读取大部分数据,但查询可以并行到所有节点,如图 2 所示。
图 2. 分区数据库环境中数据的物理分布