达梦批量处理技术
数据库系统对性能的关注,一般停留在系统IO管理、查询优化器、并发执行等方面,很少关注执行的迭代模型与表达式计算所消耗的时间。
数据库的执行计划通常以树型的数据结构表示,树中的节点被称为操作符,每个操作符完成一个特定的功能。树的叶节点用于进行数据扫描,从物理存储位置抽取记录,然后向上返回给上层节点。上层节点对记录进行加工,继续向上返回,或者再次向下要求新的记录。这就是数据库引擎典型的执行方式。这个过程中,通常不断地在各个操作符间跳来跳去,消耗大量的CPU时间。而表达式计算也是一个影响性能的重要因素,数据库系统通常把表达式翻译成内部中间语言,然后用一个虚拟机来解释执行。执行的过程本来就比较慢,如果处理的记录非常多,则解释执行的次数和CPU时间就非常可观。
达梦数据库针对执行的迭代模型和表达式计算两个方面,重新设计了执行器,对一次一条记录的迭代模型修改为一次一批数据,单条记录的表达式计算修改为数组运算,希望能借助这两个改进,实现性能的提升。这里用TPC-H Q1为例,来检验一下新版达梦执行器的改进效果。
TPC-H是一个决策支持的基准测试标准,它衡量数据库管理系统对OLAP应用或者说即席复杂查询的处理能力。这类查询通常需要大量的全表扫描,对海量数据进行过滤,分类处理,而且一般不能借助索引定位来加速查询。TPC-H标准中,定义了22个查询语句。其中第一个查询Q1是这样的:
select l_returnflag,
l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice*(1-l_discount)) as sum_disc_price,
sum(l_extendedprice*(1-l_discount)*(1+l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from lineitem
where l_shipdate <= date' 1998-12-01' - interval '90' day
group by l_returnflag, l_linestatus
order by l_returnflag, l_linestatus;
为了检验达梦的处理性能,用1G规模的TPC-H数据进行验证。在1G规模下, LINEITEM表有6001215行,其中 (l_shipdate <= date' 1998-12-01' - interval '90' day)只能过滤掉大约不到2%的数据。
在装载完数据后,用disql先看一下LINEITEM的定义和记录数:
SQL>select tabledef('SYSDBA', 'LINEITEM');
select tabledef('SYSDBA', 'LINEITEM');
--------------------------------------------------------
CREATE TABLE "SYSDBA"."LINEITEM"
(
"L_ORDERKEY" INT NOT NULL,
"L_PARTKEY" INT,
"L_SUPPKEY" INT,