【IT168 评测】在去年发表的评测文章《主流列式数据库评测Ingres VectorWise》中,我们介绍了列存储数据库Ingres VectorWise的功能特点,同时采用tpc-h scala=10数据评估它的性能。时隔一年,这种数据库又取得了哪些进展?下面为读者们揭开答案。
VectorWise在国内尚不流行,许多人知道infobright、monetdb,却不知道它,有关它的中文资料也寥若晨星,但值得一提的是,VectorWise虽然还不广为人知,但却牢牢占据了tpc-h测试几种数量级排名的前列,将许多著名厂商的产品抛在后面。详细信息见http://www.tpc.org/tpch/results/tpch_perf_results.asp。
在公司层面,VectorWise的开发公司于2011年9月放弃了历史悠久的Ingres名称,改为现在它的名称Actian。产品官方网站域名也由http://www.ingres.com/vectorwise变更为http://www.actian.com/products/vectorwise,不过你依然可以用更易记的http://vectorwise.com/访问。技术支持社区的网址是:http://community.actian.com/forum/,它有专门的vectorwise版。
Actian公司现在作为一个大数据解决方案提供商,在将近一年的时间里,发布了多款基于VectorWise的产品:VectorWise Appliance 、VectorWise Cloud等,而VectorWise 软件本身也经历了1.6版、2.0版、直至最新的2.5版。本文即针对VectorWise 2.5 sp1版展开测试。
Vectorwise2.5的新功能包括如下三方面:
1.性能更高
·预测缓冲区管理器 - 改进了并发查询的性能,在查询处理相同的数据时减少了磁盘的I/O。
·更快的批量插入??和更新 - 在更细化的级别进行从内存数据到磁盘的更新,从而使更新/插入更有效。
·IN函数的性能更快 - 对于有大量的约束的参数,IN函数的性能更强大。
·改进的并行执行 - 对更多类型的查询,充分利用多个CPU内核的全部潜力。
2.管理更轻松
·多个文件用于一个数据库,现在表的每列都存储在单独一个文件中, 从而能更灵活地存储。
·灵活的存储管理 - 把Vectorwise数据存储在多个位置可以在数据存储管理方面获得更大的灵活性。
·自动语言转译 - 自动使用国家字符集进行字符转换。
3.Vectorwise 现在捆绑Actian Director
·Actian Director是易于使用的图形界面,用于管理和与Vectorwise安装。
${PageNumber}本文将对新增功能个人比较关注的几个方面展开测试。
一、测试平台
Vectorwise 2.5支持的操作平台有为64位Windows和 64位x86 Linux,目前还没有其他平台的版本。本次测试基于的运行环境是Intel Xeon E31270 3.4Ghz,内存4GB的PC服务器,物理CPU个数是1个,1TB SAS本地磁盘,采用一块 512M缓存 RAID卡,按RAID5方式组成磁盘阵列。操作系统采用Windows Server 2008 R2 简体中文标准版,这是一个只有x64平台的版本。
二、安装
(一)VectorWise的安装步骤
登录下载地址http://esd.actian.com/后选择Vectorwise 产品,再选择“Vectorwise 2.5 Service Pack 1 Enterprise Evaluation Edition Build 162 Windows 64-Bit”下载,文件名为“vectorwise-2.5.1-162-eval-win-x86_64.zip”。(注意要下载评估版本,否则会缺少执照而无法运行)由于安装包集成了Actian Director,尺寸比旧版本有所增大,大约54 MB,但和大型数据库动辄几百兆甚至数GB的安装文件相比,仍然是十分袖珍的。安装包下载后为压缩格式,需解压缩到一个目录才能执行安装。Vectorwise 2.5在Windows操作系统的安装过程比较简单,因此本文简要地介绍一般安装步骤,专门指出易错的关键步骤。更详细的步骤,参考官方安装文档。官方文档的下载地址同上,文件名是Vectorwise25docs.zip。里面包含数据库用户指南和SQL指南。用户不必再像旧版本那样单独下载SQL指南。但打包的Actian Director的手册却需要另外下载。
1. rpm安装
将下载回来的安装包解压到临时目录,运行vectorwise-2.5.1-162-eval-win-x86_64子目录下的setup.exe文件,允许安装文件对系统更改后就进入安装向导画面。
接受许可协议后,进入安装模式选择界面:
在这里我们选择Advanced,以便对一些默认设置进行用户定制。
因为VectorWise支持安装多个实例,所以需要为安装实例命名实例ID,以便区分。
在组件选择界面,我们选择“Complete”,即安装全部组件。
安装目的位置及实例位置的选择,这里采用默认值。
接下来是数据块、内存和并行度的配置,这里需要根据用户机器的情况进行设置。
${PageNumber}然后确定是否在操作系统启动时自动VectorWise服务,以及配置时区,注意并不存在中国的时区,看来Actian公司还没有准备占领中国市场。
最后确定将VectorWise的安装路径加入系统搜索路径。这样可以方便地运行各种VectorWise的命令行工具。
在总结页面可以观察到所有的安装设置,确认无误后点击Install进行实际安装。
软件安装结束后,安装程序自动对数据库进行配置。这个过程的时间有点长,但全是自动操作,没有用户可干预的过程,稍事等待后就出现如下的安装完毕界面。
可以观察到,VectorWise服务已经启动,在系统任务栏右下角托盘中出现一个标志。右击该标志,可以在弹出的功能菜单中进行各种操作。
(二)创建数据库
启动VectorWise服务后,就可以用createdb命令创建数据库了,我们使用安装VectorWise的用户创建数据库。
Creating database 'tpch' . . .
Creating DBMS System Catalogs . . .
Modifying DBMS System Catalogs . . .
Creating Standard Catalog Interface . . .
Creating Front-end System Catalogs . . .
Creation of database 'tpch' completed successfully.
(三)连接和访问数据库
数据库创建成功后,用sql <数据库名>的方式即可连接到指定数据库,进行各种操作。注意在sql命令行中必须用\g作为一个SQL命令的结束符。Vectorwise允许查询一个常量或系统函数而不一定需要from语句。
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Microsoft Windows Version VW 2.5.1 (a64.win/162) login
Fri Aug 03 08:53:10 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
* select 1\g
Executing . . .
+------+
|col1 |
+------+
| 1|
+------+
(1 row)
continue
* \q
Vectorwise Version VW 2.5.1 (a64.win/162) logout
Fri Aug 03 09:15:23 2012
我们观察到,Vectorwise Windows版本输出使用普通的符号分隔线,而不是用特殊的制表符,复制输出结果容易辨认。不像Linux版本需要设置变量export TERM_INGRES=dumb才能实现这个功能。
${PageNumber}三、VectorWise的功能测试
(一)SQL语句的功能特点
VectorWise支持事务的DML操作,包括insert,update和delete。Commit提交一个事务,rollback回滚,这与绝大部分数据库没有区别,不再详细展开。
1. TOP-N查询
VectorWise在TOP-N查询中,对ANSI SQL标准支持较好,支持fetch first N rows only子句,同时也支持top N和first N写法,不支持MySQL的limit n写法。
Executing . . .
+-------------+-------------------------+
|r_regionkey |r_name |
+-------------+-------------------------+
| 0|AFRICA |
| 1|AMERICA |
| 2|ASIA |
+-------------+-------------------------+
(3 rows)
continue
* select r_regionkey,r_name from region order by r_name fetch first 3 rows only\g
Executing . . .
+-------------+-------------------------+
|r_regionkey |r_name |
+-------------+-------------------------+
| 0|AFRICA |
| 1|AMERICA |
| 2|ASIA |
+-------------+-------------------------+
(3 rows)
* select top 3 r_regionkey,r_name from region order by r_name\g
Executing . . .
+-------------+-------------------------+
|r_regionkey |r_name |
+-------------+-------------------------+
| 0|AFRICA |
| 1|AMERICA |
| 2|ASIA |
+-------------+-------------------------+
(3 rows)
* select r_regionkey,r_name from region order by r_name limit 3\g
Executing . . .
E_US09C5 line 1, Syntax error on 'limit'. The correct syntax is:
SELECT [ALL|DISTINCT] target_list
FROM table(s)
[WHERE search_cond]
[GROUP BY col(s)]
[HAVING search_cond]
[UNION subselect]
[ORDER BY col(s)]
(Sun Aug 05 20:15:32 2012)
continue
2.自动退出不满足资源的查询的执行
如果系统不满足SQL语句运行环境的要求,Vectorwise会直接报错退出,而不是勉强执行,这对那些耗费资源的SQL语句特别有用,比如以下tpch第5个查询。
n_name,
sum(l_extendedprice * (1 - l_discount)) as revenue
from
customer,
orders,
lineitem,
supplier,
nation,
region
where
c_custkey = o_custkey
and l_orderkey = o_orderkey
and l_suppkey = s_suppkey
and c_nationkey = s_nationkey
and s_nationkey = n_nationkey
and n_regionkey = r_regionkey
and r_name = 'AFRICA'
and o_orderdate >= date '1996-01-01'
and o_orderdate < date '1996-01-01' + interval '1' year
group by
n_name
order by
revenue desc\g
E_VW1150 Not enough memory to perform a hash join (HashJoinN@22 stores
55899644 records with 13977 unique keys). Consider enabling disk spilling
for hash join (the engine/enable_hashjoin_disk_spilling=true parameter),
increase the max_memory_size parameter or consult the Vectorwise User
Guide for other solutions.
(Fri Aug 03 09:59:20 2012)
按照上述错误提示信息设置engine/enable_hashjoin_disk_spilling=true参数并不能解决这个问题,因为我导入数据后没有做统计分析,因此Vectorwise在产生执行计划时无法精确估计执行成本,误以为这个SQL无法执行。而执行统计分析后,这个问题就不存在了。
值得一提的是,Vectorwise在未执行统计分析、缺少相关信息的情况下对大部分tpch查询的支持仍然较好,除了这个查询外的所有查询都执行成功,且执行效率很高,让人怀疑是否它是专为tpch查询而生的。具体对比数据见第四部分。
3.支持分析函数
在去年的测试中Vectorwise 1.5还不支持分析函数,但从1.6版开始,它陆续引入分析函数的支持,在2.0版中又添加了几个分析函数。目前支持的有DENSE_RANK()、NTILE()、PERCENT_RANK()、RANK()和 ROW_NUMBER() 。
分析函数的一般语法是:
分析函数名() OVER (PARTITION BY 分区关键字 ORDER BY 排序关键字 DESC|ASC) 。
分析函数只能位于select子句和order by子句,而不能放在where、group by、having等子句中。下面举例说明分析函数,首先创建一个测试表。
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Microsoft Windows Version VW 2.5.1 (a64.win/162) login
Wed Aug 29 08:14:26 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
* create table emp(empno int,name varchar(20));
* \g
Executing . . .
continue
* insert into emp values(1,'wang');
* insert into emp values(2,'zhang');
* insert into emp values(3,'Li');
* insert into emp values(4,'sun');
* \g
Executing . . .
(1 row)
(1 row)
(1 row)
(1 row)
continue
* select * from emp;
* \g
Executing . . .
+-------------+--------------------+
|empno |name |
+-------------+--------------------+
| 1|wang |
| 2|zhang |
| 3|Li |
| 4|sun |
+-------------+--------------------+
(4 rows)
continue
Over()中可以为空、可以包含partition by子句和order by子句。分区和排序的关键字可以是列名,也可以是表达式。最后给出同时在select子句和order子句中使用分析函数的例子。
* \g
Executing . . .
+-------------+--------------------+----------------------+
|empno |name |rk |
+-------------+--------------------+----------------------+
| 3|Li | 1|
| 4|sun | 2|
| 1|wang | 3|
| 2|zhang | 4|
+-------------+--------------------+----------------------+
(4 rows)
continue
* select empno,name,mod(empno,2)md,rank()over(partition by mod(empno,2) order by length(name) desc)rk from emp;
* \g
Executing . . .
+-------------+--------------------+------+----------------------+
|empno |name |md |rk |
+-------------+--------------------+------+----------------------+
| 2|zhang | 0| 1|
| 4|sun | 0| 2|
| 1|wang | 1| 1|
| 3|Li | 1| 2|
+-------------+--------------------+------+----------------------+
(4 rows)
continue
* select empno,name,rank()over(order by length(name))rk from emp order by rank()over(order by empno desc);
* \g
Executing . . .
+-------------+--------------------+----------------------+
|empno |name |rk |
+-------------+--------------------+----------------------+
| 4|sun | 2|
| 3|Li | 1|
| 2|zhang | 4|
| 1|wang | 3|
+-------------+--------------------+----------------------+
(4 rows)
continue
需要注意,其他数据库中,sum、max等函数既可以作为聚集函数也可以作为分析函数,而在Vectorwise中,这些函数被称为窗口聚集函数(Windowing Aggregate Functions) ,特点是over子句中只能包含partition子句或为空,不能包含order by子句。
* \g
Executing . . .
E_US2517 SELECT: aggregate window function 'sum' may not include ORDER BY
clause.
(Thu Aug 30 10:03:39 2012)
continue
* select empno,name,sum(empno)over()rk from emp;
* \g
Executing . . .
+-------------+--------------------+----------------------+
|empno |name |rk |
+-------------+--------------------+----------------------+
| 1|wang | 10|
| 2|zhang | 10|
| 3|Li | 10|
| 4|sun | 10|
+-------------+--------------------+----------------------+
(4 rows)
4.支持With子查询CTE(公用表表达式)
Vectorwise支持With子查询CTE(公用表表达式)。但虚表必须从实际表或在前面已经定义的虚表中选择,否则报表不存在的错误信息。不支持递归CTE。
* \g
Executing . . .
+-------------+--------------------+
|empno |name |
+-------------+--------------------+
| 1|wang |
+-------------+--------------------+
(1 row)
continue
* with t as(select 1 empno)select * from t where empno=1
* \g
Executing . . .
E_US0845 Table 't' does not exist or is not owned by you.
(Thu Aug 30 10:13:53 2012)
continue
后面定义的t1表引用了前面定义的t表
* with t as(select * from emp),
* t1 as(select * from t where empno=1)
* select * from t,t1 where t.empno>t1.empno;
* \g
Executing . . .
+-------------+--------------------+-------------+--------------------+
|empno |name |empno |name |
+-------------+--------------------+-------------+--------------------+
| 1|wang | 2|zhang |
| 1|wang | 3|Li |
| 1|wang | 4|sun |
+-------------+--------------------+-------------+--------------------+
(3 rows)
continue
--不支持递归CTE
* with
* t1(empno,name) as(select empno,name from emp where empno=1
* union all
* select empno+1,name from t1 where empno<4
* )
* select * from t,t1 where t.empno>t1.empno;
* \g
Executing . . .
E_US0845 Table 't1' does not exist or is not owned by you.
(Fri Aug 31 07:34:47 2012)
continue
5.一些特色功能
1)Squeeze函数把文本字符串参数中的多个空格替换成1个,但前后缀空格被删除。
* \g
Executing . . .
+---------------------------------------------+
|t |
+---------------------------------------------+
|Long long ago, there is a King |
+---------------------------------------------+
(1 row)
continue
2) SUBSTRING_INDEX函数返回一个字符串中分隔字符的第n次出现为止的子串。
它的参数格式是SUBSTRING_INDEX(str,delim,count)。
但这个函数的第一个参数只对Vectorwsie类型的表中的列有效,而对文本字面量未实现,文档43页中的例子是错误的。
* \g
Executing . . .
E_AD8999 The function `substring_index()' is not currently implemented.
(Wed Aug 29 08:31:11 2012)
continue
* create table test (n varchar(100));
* insert into test values('www.actian.com');
* insert into test values('www.vectorwise.com');
* select substring_index(n,'.',2) from test;
* \g
Executing . . .
(1 row)
(1 row)
+---------------+
|col1 |
+---------------+
|www.actian |
|www.vectorwise |
+---------------+
(2 rows)
continue
3) 查看SQL语句的执行计划
VectorWise查看SQL语句的执行计划,不像其他数据库有单独的explain命令,它是通过在select语句中的with qep选项实现的。相当于Oracle的set autotrace on,它既输出执行计划,也输出执行结果。
* \g
Executing . . .
********************************************************************
QUERY PLAN 2,2, no timeout, of simple aggregate
aggregate expression -> count(*)
Sort Unique
Pages 996 Tups 200000
D1785 C25016
/
Hash Join(p_partkey)
HashJoinN
Heap
Pages 996 Tups 200000
D1731 C24960
/ \
Proj-rest Proj-rest
Partial(p_partkey) SortU on(p_partkey)
Pages 9901 Tups 2000000 Pages 80 Tups 20000
D18 C2000 D93 C2000
/ /
part_col part_col
X100(NU) (part_col000)
Pages 1465 Tups 2000000 X100(NU)
Pages 7446 Tups 2000000
********************************************************************
+----------------------+
|col1 |
+----------------------+
| 0|
+----------------------+
(1 row)
continue
上述输出表明,Vectorwise在处理IN子查询时使用了Hash连接。
6.需要改进之处
Vectorwise也还有不少不支持的功能,主要有如下方面:
·不支持存储过程、用户自定义函数和触发器。
·不支持分区和group by的rollup、cube扩展。
·不支持表和重命名和列的修改。
·不支持LOB数据类型。
·不支持truncate table语句。
此外,正如前面的例子所示,VectorWise只能在执行sql时显示执行计划,但不能单独显示执行计划,从而无法在执行sql前根据显示的执行计划调整语句写法,调试sql容易浪费大量时间。
${PageNumber}(二)数据库信息查询
如果要了解某个表的空间占用情况,VectorWise提供了命令vwinfo用来查看数据库的相关信息。-t 参数指定需要查看的表。要注意必须经过统计分析的表的相关信息才能反映在vwinfo命令的输出结果上。
Usage: vwinfo [options] database
Options:
-c --config Display active configuration
-C --column_block_use Display per-column block use
-o --open_transactions Display open transactions and active sessions
-s --stats Display general statistics (default)
-T --table_block_use Display per-table block use
-h --help Print this help text
-t --table table Table to load to
-v --verbose Print verbose progress info
C:\Users\db2admin\pgsql\bin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwinfo" -T tpch
+------------------------+------------------------+--------------------+
|schema_name |table_name |block_count |
+------------------------+------------------------+--------------------+
|db2admin |customer | 446|
|db2admin |lineitem | 5646|
|db2admin |nation | 4|
|db2admin |orders | 2388|
|db2admin |part | 239|
|db2admin |partsupp | 2064|
|db2admin |region | 3|
|db2admin |supplier | 31|
|db2admin |tmp | 0|
+------------------------+------------------------+--------------------+
运行vwinfo -s数据库名,那么输出关于数据库的信息。
+--------------------------------+--------------------------------------------+
|stat |value |
+--------------------------------+--------------------------------------------+
|memory.query_allocated |41173664 |
|memory.query_maximum |2147483648 |
|memory.query_peak |62177728 |
|memory.query_virtual_allocated |45368944 |
|memory.query_virtual_maximum |4398046511104 |
|memory.query_virtual_peak |199781039216 |
|memory.update_allocated |2382 |
|memory.update_maximum |536870912 |
|memory.committed_transactions |0 |
|memory.bufferpool_allocated |0 |
|memory.bufferpool_maximum |1070596096 |
|bm.block_size |524288 |
|bm.group_size |8 |
|bm.columnspace_used_blocks |10821 |
|bm.bufferpool_total_blocks |2042 |
|bm.bufferpool_free_blocks |2042 |
|bm.bufferpool_used_blocks |0 |
|bm.bufferpool_cached_blocks |0 |
|bm.columnspace_location |C:\Program Files\Actian\VectorwiseVW\ingres\data\vectorwise\tpch\CBM\default\0|
|system.active_sessions |2 |
|system.log_file_size |2139574 |
|system.threshold_log_condense |33554432 |
|server.port_number |7659 |
|server.pid |4404 |
+--------------------------------+--------------------------------------------+
我们可以通过块大小乘以块数目得出某个表占用的实际空间。比如lineitem表,5646*512KB,即约2.8GB。
将用上述表达式计算的占用空间与文本文件相比较,就能得出各个表的压缩率信息。比如lineitem表即为5646*512*1024/7,775,727,688=0.38。
驱动器 C 中的卷没有标签。
卷的序列号是 3CE2-73F3
C:\Users\db2admin\pgsql 的目录
2012/07/28 19:58 244,847,642 customer.txt
2012/07/27 22:32 7,775,727,688 lineitem.txt
2012/07/28 20:05 2,224 nation.txt
2012/07/27 22:21 1,749,195,031 orders.txt
2012/07/27 22:05 244,077,872 part.txt
2012/07/27 22:08 1,204,850,769 partsupp.txt
2012/07/27 22:03 389 region.txt
2012/07/28 20:00 14,176,368 supplier.txt
由于Vectorwise改进了存储方式,由把所有表的数据保存在一个文件改为对每个表的每个列使用一个文件保存数据,从文件名中包含的表名和列名也可以查看空间占用信息。比如lineitem表,将文件名以<用户>Slineitem开始的文件大小加起来得到2,957,332,480字节,与vwinfo报告的信息基本一致。
驱动器 C 中的卷没有标签。
卷的序列号是 3CE2-73F3
C:\Program Files\Actian\VectorwiseVW\ingres\data\vectorwise\tpch\CBM\default 的目录
2012/08/03 21:31 <DIR> .
2012/08/03 21:31 <DIR> ..
2012/08/03 20:51 64 db_key
2012/08/03 21:24 4,112,384 _db2adminScustomer__c_acctbal_00000034
2012/08/03 21:24 45,010,944 _db2adminScustomer__c_address_00000031
2012/08/03 21:24 116,248,576 _db2adminScustomer__c_comment_00000036
2012/08/03 21:24 847,872 _db2adminScustomer__c_custkey_00000029
2012/08/03 21:24 798,720 _db2adminScustomer__c_mktsegment_00000035
2012/08/03 21:24 34,508,800 _db2adminScustomer__c_name_00000030
2012/08/03 21:24 987,136 _db2adminScustomer__c_nationkey_00000032
2012/08/03 21:24 30,007,296 _db2adminScustomer__c_phone_00000033
2012/08/03 21:36 1,889,894,400 _db2adminSlineitem__l_comment_00000061
2012/08/03 21:36 91,947,008 _db2adminSlineitem__l_commitdate_00000057
2012/08/03 21:36 31,903,744 _db2adminSlineitem__l_discount_00000052
2012/08/03 21:36 181,870,592 _db2adminSlineitem__l_extendedprice_00000051
2012/08/03 21:36 31,891,456 _db2adminSlineitem__l_linenumber_00000049
2012/08/03 21:36 41,263,104 _db2adminSlineitem__l_linestatus_00000055
2012/08/03 21:36 41,263,104 _db2adminSlineitem__l_orderkey_00000046
2012/08/03 21:36 159,453,184 _db2adminSlineitem__l_partkey_00000047
2012/08/03 21:36 46,952,448 _db2adminSlineitem__l_quantity_00000050
2012/08/03 21:36 91,947,008 _db2adminSlineitem__l_receiptdate_00000058
2012/08/03 21:36 31,879,168 _db2adminSlineitem__l_returnflag_00000054
2012/08/03 21:36 91,947,008 _db2adminSlineitem__l_shipdate_00000056
2012/08/03 21:36 31,883,264 _db2adminSlineitem__l_shipinstruct_00000059
2012/08/03 21:36 31,899,648 _db2adminSlineitem__l_shipmode_00000060
2012/08/03 21:36 129,433,600 _db2adminSlineitem__l_suppkey_00000048
2012/08/03 21:36 31,903,744 _db2adminSlineitem__l_tax_00000053
...
(三)数据库管理功能
1.多位置存储
在过去版本的Vectorwise中,是不支持多位置存储的,数据库中所有的表存储在一个大文件中,如果删除数据或表,文件的大小不能缩小,但空闲的空间可以被将来其他表和数据重用。这种存储结构有一些弊端:第一,扩展性差,如果一个磁盘驱动器或分区空间不足了,就不能装载更多的数据,必须创建一个更大的存储空间,然后把数据迁移过去。第二,读写成本高,随着数据的增删改比例的增大,容易使数据存储变得支离破碎,读写需要扫描更多的数据块。第三,数据库维护难度高,所有的数据都在一个文件中,万一文件意外损坏,是很难从中恢复数据的。2.5版引入的多位置存储功能解决了这些问题。
多位置存储有两层含义,一是指列式存储表的各列存储在不同的文件中;二是指数据库的表和表的列可以存储在不同磁盘驱动器或分区。
Vectorwise通过创建位置(location)和扩展数据库(extenddb)两步操作使数据库能识别不同的存储位置。
创建位置的命令语法是create location 位置名 with area = '操作系统文件目录路径' , usage = (用途类型1, 用途类型2…) |NOUSAGE。
其中用途类型的合法值有DATABASE、WORK 、CHECKPOINT 、JOURNAL 、DUMP 、ALL,但只有DATABASE、WORK 、CHECKPOINT三种可以用于Vectorwise列式存储的表,JOURNAL和DUMP只能用在原有ingres类型的表。NOUSAGE表示该位置不可用。
需要注意SQL Guide文档161页中的例子是不正确的,用途类型必须用括号括起来,否则会出现语法错误。
extenddb命令的用法有两种,既可以用命令行参数,也可以只输入extenddb命令,用交互方式输入提示信息要求提供的内容。命令行语法是:extenddb –l位置名 –U用途类型 数据库名。
下面举例说明多位置存储的用法。
1.建立位置,必须在iidbdb数据库执行
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Microsoft Windows Version VW 2.5.1 (a64.win/162) login
Wed Sep 05 19:09:38 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
* create location temp_loc with area = 'C:\Users\db2admin\Downloads/temp' , usage = (work);\g
Executing . . .
continue
如果忘记将用途类型用括号括起来,将会报语法错误。
* \g
Executing . . .
E_US0EF4 line 1, Syntax error on 'usage'. The correct syntax is:
CREATE LOCATION <location_name>
WITH
AREA = '<area_name>'
[, USAGE = (<usage> {,<usage>}) | NOUSAGE]
[, RAWPCT = <rawpct> ]
where <usage> is DATABASE, WORK, JOURNAL, CHECKPOINT, DUMP or
ALL
and <rawpct> is a positive integer from 0 through 100.
(Wed Sep 05 06:56:07 2012)
continue
create location命令如果不在iidbdb执行,会出错
Executing . . .
E_US18D4 You must be connected to the 'iidbdb' database
to issue 'CREATE/ALTER/DROP LOCATION' statements.
Ensure your session is connected to the iidbdb database.
(Wed Sep 05 07:00:25 2012)
continue
在windows下使用位置要特别注意,如果把\写成了/,也会出错,而且这个错误提示信息是很隐晦的。
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Microsoft Windows Version VW 2.5.1 (a64.win/162) login
Wed Sep 05 07:02:05 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
* create location temp_loc with area = 'C:/Users/db2admin/Downloads/temp' , usage = (work);\g
Executing . . .
E_SC0206 An internal error prevents further processing of this query.
Associated error messages which provide more detailed information about
the problem can be found in the error log, II_LOG:errlog.log
(Wed Sep 05 07:02:18 2012)
E_SC0206 An internal error prevents further processing of this query.
Associated error messages which provide more detailed information about
the problem can be found in the error log, II_LOG:errlog.log
(Wed Sep 05 07:02:18 2012)
Exiting session because of communications failure.
2.将位置添加到数据库,以便它能够被识别。
需要退出sql交互工具,在操作系统命令行操作。注意提示的按RETURN结束指在不输入内容的前提下按下一个回车符,因为一个位置可以被多个数据库识别,工具依靠这个来判断所有的数据库名都输入完毕了。
Your SQL statement(s) have been committed.
Vectorwise Version VW 2.5.1 (a64.win/162) logout
Wed Sep 05 19:10:35 2012
C:\Users\db2admin>extenddb
INGRES EXTENDDB Copyright 2012 Ingres Corporation
Location name? temp_loc
Database name(end with RETURN)? tpch2
Database name(end with RETURN)?
Location usage(data,work|awork)? data
3.连接到要使用位置的数据库创建表并插入数据
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Microsoft Windows Version VW 2.5.1 (a64.win/162) login
Wed Sep 05 19:24:52 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
下面这个命令创建的表name列用到了刚才创建并添加到数据库的位置,其余列仍用ii_database变量指定的默认存储位置
Executing . . .
continue
*
下面这个命令创建的表所有列都用刚才创建并添加到数据库的位置存储
Executing . . .
continue
*
* insert into test_loc values(1,'name1');
* insert into test_loc2 values(1,'name1');
* \g
Executing . . .
所创建的位置在操作系统文件系统上的布局如下:
文件夹 PATH 列表
卷序列号为 3CE2-73F3
C:\USERS\DB2ADMIN\DOWNLOADS\TEMP
└─ingres
├─data
│ ├─default
│ │ └─tpch2
│ └─vectorwise
│ └─tpch2
└─work
├─default
└─vectorwise
如果要查看当前数据库使用的位置情况,用infodb命令,所有存储位置都列在输出的底部位置。
==================Thu Sep 06 19:43:41 2012 Database Information=================
Database : (tpch2,db2admin) ID : 0x5042C2DF Default collation :
Unicode enabled : Yes
Always logged : No
Default unicode collation : udefault Unicode normalization : NFC
Extents : 6 Last Table Id : 278
Config File Version Id : 0x00070001 Database Version Id : 9
Mode : DDL ALLOWED, ONLINE CHECKPOINT ENABLED
Status : VALID
The Database is not Journaled.
MVCC is enabled in this database.
Journals are not valid from any checkpoint.
----Journal information---------------------------------------------------------
Checkpoint sequence : 0 Journal sequence : 0
Current journal block : 0 Journal block size : 16384
Initial journal size : 4 Target journal size : 512
Last Log Address Journaled : <0:0:0>
----Dump information------------------------------------------------------------
Checkpoint sequence : 0 Dump sequence : 0
Current dump block : 0 Dump block size : 16384
Initial dump size : 4 Target dump size : 512
Last Log Address Dumped : <0:0:0>
----Checkpoint History for Journal----------------------------------------------
Date Ckp_sequence First_jnl Last_jnl valid mode
----------------------------------------------------------------------------
None.
----Checkpoint History for Dump-------------------------------------------------
Date Ckp_sequence First_dmp Last_dmp valid mode
----------------------------------------------------------------------------
None.
----Cluster Journal History-----------------------------------------------------
Node ID Current Journal Current Block Last Log Address
------------------------------------------------------------
None.
----Cluster Dump History-----------------------------------------------------
Node ID Current Dump Current Block Last Log Address
------------------------------------------------------------
None.
----Extent directory------------------------------------------------------------
Location Flags Physical_path
------------------------------------------------------------------
ii_database ROOT,DATA,VWROOT C:\Program Files\Actian\VectorwiseVW\ingres\data\default\tpch2
ii_journal JOURNAL C:\Program Files\Actian\VectorwiseVW\ingres\jnl\default\tpch2
ii_checkpoint CHECKPOINT C:\Program Files\Actian\VectorwiseVW\ingres\ckp\default\tpch2
ii_dump DUMP C:\Program Files\Actian\VectorwiseVW\ingres\dmp\default\tpch2
ii_work WORK C:\Program Files\Actian\VectorwiseVW\ingres\work\default\tpch2
temp_loc DATA C:\Users\db2admin\Downloads/temp\ingres\data\default\tpch2
================================================================================
----Vectorwise directory--------------------------------------------------------
Location Flags Physical_path
------------------------------------------------------------------
ii_database ROOT,DATA,VWROOT C:\Program Files\Actian\VectorwiseVW\ingres\data\vectorwise\tpch2
ii_checkpoint CHECKPOINT C:\Program Files\Actian\VectorwiseVW\ingres\ckp\vectorwise\tpch2
ii_work WORK C:\Program Files\Actian\VectorwiseVW\ingres\work\vectorwise\tpch2
temp_loc DATA C:\Users\db2admin\Downloads/temp\ingres\data\vectorwise\tpch2
================================================================================
2.数据库多版本共存
有时候,我们在升级数据库版本之前,想要在测试环境同时安装两种版本的数据库,这样就可以测试在同等条件下,新版本比起旧版本有哪些改进。Vectorwise提供了这种功能,它是通过对不同版本的数据库实例采用不同的实例名来实现的。由于条件限制,我们在去年测试Vectorwise的Linux环境中举例。
安装第二个Vectorwise实例是通过执行ingres_express_install.sh脚本实现的,它的命令行语法是:
ingres_express_install.sh [-respfile文件名] [安装ID] [安装根路径]
其中安装ID是一个包含两个字符的字符串,第一个字符必须是大写字母,第二个字符可以大写字母或数字,它对于安装第二个实例是必须的,因为第一个实例一般占用了VW安装ID。安装ID和安装根路径必须和第一个实例的不同。
Vectorwise的Linux安装包有两种格式,rpm格式和ingbuild格式,其中rpm格式不支持升级也不支持新旧版本共存,如果输入安装命令,会提示出错。
Vectorwise 2.5.1 Express Install
Checking public key...
Warning: No key for "Vectorwise 2.5" found
Verifying RPMs... FAIL
/user1/vectorwise-2.5.1-162-NPTL-eval-linux-rpm-x86_64/./rpm/director-1.0.0-114.x86_64.rpm: (SHA1) DSA sha1 md5 (GPG) NOT OK (MISSING KEYS: GPG#f7144a91)
…
Warning!
Unable to verify packages as authentic. Please check you have the latest
Vectorwise 2.5 (RPM)
public key installed. It can be downloaded from ESD - Electronic Software Distribution
and installed by running:
rpm --import <keyfile>
as root.
Do you wish to continue? (y or N): Y
warning: /user1/vectorwise-2.5.1-162-NPTL-eval-linux-rpm-x86_64/./rpm/vectorwise-2.5.1-162.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID f7144a91
Checking for current installations...
The following Vectorwise packages are already installed:
ingresvw-1.5.0-141
ingres_express_install.sh does not support upgrade.
See the Installation Guide for more information.
Ingbuild版本是支持多版本的。同样输入前面的命令行就可以成功安装。
Vectorwise 2.5.1 Express Install
II_SYSTEM: /user1/app/vw25
II_INSTALLATION: TF
Creating /user1/app/vw25...
Begining installation...
ACTIAN CORPORATION
Do you accept this license agreement? (y or n): y
Products selected: 4 Disk space required: 0
Support modules : 22 216M
-- Temporary storage : 24M
----
Total: 26 240M
Reading from distribution medium... (This may take a few minutes)
Verifying support module: basic...
Verifying support module: config...
Verifying support module: dbatools...
…
Moving files for support module: mgmtsvc...
Writing installation descriptor file...
Setting up support module: esqlsup...
Setting up product: Terminal Monitors...
Setting up product: Vectorwise DBMS...
Setting up product: Vectorwise Networking...
Setting up product: Vectorwise Data Access Server...
Setting up product: Vectorwise ODBC Driver...
Setting up support module: mgmtsvc...
All installed products are now available for use.
Writing installation descriptor file...
Vectorwise 2.5.1 has installed successfully.
The instance will now be started...
Vectorwise/ingstart
Checking host "redflag11012602" for system resources required to run Vectorwise...
Your system has sufficient resources to run Vectorwise.
Starting your Vectorwise installation...
Starting the Name Server...
Allocating shared memory for Logging and Locking Systems...
Starting the Recovery Server...
II_DBMS_SERVER = 40081
Starting the Archiver Process...
Starting DBMS Server (default)...
II_DBMS_SERVER = 12798
Starting Net Server (default)...
GCC Server = 23942
TCP_IP port = TF (26672)
Starting Data Access Server (default)...
DAS Server = 58476
TCP_IP port = TF7 (26679)
Starting the Visual DBA Remote Command Server...
Starting Remote Manager Server...
Vectorwise installation successfully started.
Building the password validation program 'ingvalidpw'.
Executable successfully installed.
安装了多个版本,应该如何分别连接到不同实例的数据库呢,这就需要通过安装时产生的用户配置文件来实现,用户配置文件保存在用户主目录下,Vectorwise 2.5对应bash和C shell的配置文件分别是.ingTFsh和.ingTFsh,文件名中的TF就是我们安装时提供的安装ID,文件的内容如下:
# Vectorwise environment for TF installation
# Generated at installation time
TERM_INGRES=vt100fx
II_SYSTEM=/user1/app/vw25
PATH=$II_SYSTEM/ingres/bin:$II_SYSTEM/ingres/utility:${PATH:-"/bin:/usr/bin"}
LD_LIBRARY_PATH=/user1/app/vw25/ingres/lib:/user1/app/vw25/ingres/lib/lp32:${LD_LIBRARY_PATH:-"/lib:/usr/lib"}
export II_SYSTEM TERM_INGRES PATH LD_LIBRARY_PATH
可以看出,它把第二个实例的相关路径添加到系统搜索路径,并设置环境变量。用户用.命令执行它以后输入Vectorwise的命令就自动执行第二个实例的命令。下面是在新安装的实例中创建数据库tpch2并用sql命令连接tpch2的例子。
[ingres@redflag11012602 ~]$ . ~/.ingTFsh
[ingres@redflag11012602 ~]$ createdb tpch2
Creating database 'tpch2' . . .
Creating DBMS System Catalogs . . .
Modifying DBMS System Catalogs . . .
Creating Standard Catalog Interface . . .
Creating Front-end System Catalogs . . .
Creation of database 'tpch2' completed successfully.
[ingres@redflag11012602 ~]$ sql tpch2
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Linux Version VW 2.5.1 (a64.lnx/162)NPTL login
Wed Oct 24 18:47:06 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
*
四、性能测试
测试项目包含二方面,第一是加载,数据仓库要处理的数据量巨大,数据加载能力是选择数据库软件要考虑的重要因素之一,我们将测试包括外部文本数据加载和从数据库内部抽取部分数据到其他表的性能。加载之后再顺便了解压缩,数据压缩时常被作为列式存储数据库的一个卖点来宣传,因此我们单独把它列出。第二是测试重点,数据查询,采用tpc-h 的数据和查询语句,数据规模是scala=10。
(一)数据加载
1. 从外部文本文件导入
首先执行脚本创建表结构,命令格式如下:
INGRES TERMINAL MONITOR Copyright 2012 Ingres Corporation
Vectorwise Microsoft Windows Version VW 2.5.1 (a64.win/162) login
Fri Aug 03 09:11:44 2012
Enter \g to execute commands, "help help\g" for help, \q to quit
continue
* * * * * Executing . . .
continue
* * * * Executing . . .
continue
* * * * * * * * * * Executing . . .
continue
* * * * * * * * Executing . . .
continue
* * * * * * Executing . . .
continue
* * * * * * * * * Executing . . .
continue
* * * * * * * * * * Executing . . .
continue
* * * * * * * * * * * * * * * * * Executing . . .
Your SQL statement(s) have been committed.
VectorWise 2.5中,原有的iivwfastload导入外部文件工具改名为vwload,虽然名称中去掉了fast字样,但它仍是最快的导入方式,命令行参数如下:
vwload -table <表名> <数据库名> <文本数据文件完整路径> -fdelim 列分隔符 -rdelim 行分隔符,其中行列分隔符需要用一对''括起来。支持\n等转义符写法。但不支持多个字节分隔符。
Record delimiter must be a single ASCII character
Usage: vwload [options] database file ...
Try vwload --helpC:\Users\db2admin>load nation
由于tpch原始生成的数据行分隔符是一个竖线加一个换行,需要删除多余的竖线才能被vwload工具识别,在Linux下可以用管道函数对此进行处理,在Windows下不能这么处理,只好另想办法,最后采用自己编写一个小C程序对文本文件进行预处理,然后让vwload读取处理后的文本文件。希望将来vwload可以解决这个问题。
int main(int argc,char* argv[])
{
char s[1000];
FILE *in=fopen(argv[1],"r");
FILE *out=fopen(argv[2],"w");
while(1)
{
fgets(s,999,in);
if (feof(in))
break;
s[strlen(s)-2]='\0';
fprintf(out,"%s\n",s);
}
fclose(in);
fclose(out);
return 0;
}
用c程序处理后的文件保存为C:\Users\db2admin\pgsql\表名.txt
由于Windows命令行下不支持在一行执行多个命令,因此编写一个批处理文件load.bat
"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table %1 tpch C:\Users\db2admin\pgsql\%1.txt
time <cr
这个批处理文件接受一个表名参数,自动将参数添加到命令行的相应位置。装载8个表的日志如下:
当前时间: 21:23: 51.30
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table nation tpch C:\Users\db2admin\pgsql\nation.txt
loading
processed 25 records, loaded 25 records, 0 errors
当前时间: 21:23:51.74
C:\Users\db2admin>load region
当前时间: 21:24:00.87
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table region tpch C:\Users\db2admin\pgsql\region.txt
loading
processed 5 records, loaded 5 records, 0 errors
当前时间: 21:24:01.19
C:\Users\db2admin>load customer
当前时间: 21:24:11.91
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table customer tpch C:\Users\db2admin\pgsql\customer.txt
loading
processed 1500000 records, loaded 1500000 records, 0 errors
当前时间: 21:24:32.24
C:\Users\db2admin>load supplier
当前时间: 21:25:24.14
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table supplier tpch C:\Users\db2admin\pgsql\supplier.txt
loading
processed 100000 records, loaded 100000 records, 0 errors
当前时间: 21:25:26.04
C:\Users\db2admin>load part
当前时间: 21:25:32.56
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table part tpch C:\Users\db2admin\pgsql\part.txt
loading
processed 2000000 records, loaded 2000000 records, 0 errors
当前时间: 21:25:46.96
C:\Users\db2admin>load partsupp
当前时间: 21:25:53.11
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table partsupp tpch C:\Users\db2admin\pgsql\partsupp.txt
loading
processed 8000000 records, loaded 8000000 records, 0 errors
当前时间: 21:27:24.88
C:\Users\db2admin>load orders
当前时间: 21:27:34.66
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table orders tpch C:\Users\db2admin\pgsql\orders.txt
loading
processed 15000000 records, loaded 15000000 records, 0 errors
当前时间: 21:29:34.82
C:\Users\db2admin>load lineitem
当前时间: 21:29:44.86
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table lineitem tpch C:\Users\db2admin\pgsql\lineitem.txt
loading
processed 59986052 records, loaded 59986052 records, 0 errors
当前时间: 21:36:03.46
我们看到,导入总用时10分28秒,其中最大的lineitem表用了6分钟18秒。这比去年1.5版的测试结果稍慢,但两者的操作系统和硬件配置差别很大,因此不具有比较意义。
在测试即将结束之际,通过技术支持社区了解到,vwload有一个单独的-I选项可以忽略文件最后一个字段,用该选项在Linux环境下导入orders表的时间为29秒,而用sed命令处理最后一个|的时间是5分钟。这也是一个教训,任何时候首先看产品是否实现了你需要的功能,不要贸然用“土”办法解决。否则吃力不讨好。下面列出vwload的全部选项,供参考。
Usage: vwload [options] database file ...
Options:
-a --attributes attr,... List of attributes to load (default: all)
-B --rollback on/off Roll back on failure
-C --charset s Input character set (default: no conversion)
-d --dateformat format|attr=format,...
Set date format for attribute
-e --escape c Escape character to use (default: none)
-f --fdelim c Field delimiter to use (default: "|")
-h --help Print this help text
-H --header Skip header line in file(s)
-i --ignfirst Ignore first field
-I --ignlast Ignore last field
-l --log file Log failed records to file
-n --nullvalue s NULL value string to use
-p --profile file write server side profiling data to file
-P --password password Password to use (default: prompt when needed)
-q --quote c Quote character(s) to use (default: none)
-r --rdelim c Record delimiter to use (default: "\n")
-s --skip n Skip the first n records
-S --substitute c Substitute invalid input characters with c
-t --table table Table to load to
-T --textmode Open files in text mode
-u --user user Effective user
-v --verbose Print verbose progress info
-x --errcount n Terminate after n errors
2. 从数据库内部抽取数据到其他表
数据库从库内转移数据的方法,VectorWise支持create table new as select * from org这种方式。表的存储类型支持默认的列式,也支持指定WITH STRUCTURE = VECTORWISE_ROW选项创建行式存储表。
我们从part表复制所有记录保存到part_row行式存储表,用时是13秒。比vwload工具导入还快了大约1秒。而同样的数据保存到part_col列式存储表,用时是9.5秒,比行式存储又快了近4秒。
* CREATE TABLE PART_ROW as select * from part WITH STRUCTURE = VECTORWISE_ROW ;
* select local_time;
* \g
Executing . . .
+-------------------------------+
|col1 |
+-------------------------------+
|20:43:34.427041 |
+-------------------------------+
(1 row)
(2000000 rows)
+-------------------------------+
|col1 |
+-------------------------------+
|20:43:47.203464 |
+-------------------------------+
(1 row)
continue
* select local_time;
* CREATE TABLE PART_COL as select * from part WITH STRUCTURE = VECTORWISE ;
* select local_time;
* \g
Executing . . .
+-------------------------------+
|col1 |
+-------------------------------+
|20:46:20.567333 |
+-------------------------------+
(1 row)
(2000000 rows)
+-------------------------------+
|col1 |
+-------------------------------+
|20:46:29.989750 |
+-------------------------------+
(1 row)
continue
虽然Vectorwise还支持为表添加主外键约束和额外索引,可以进一步改善某些查询,由于是聚簇索引,因此每个表只能添加一个索引。但它不支持在已有数据的表中添加键和索引,只能在空表中添加,这点不太方便,因为表中的约束和索引会降低导入和插入性能,因此对小表还可以用,如part表加了主键,insert时间从9.42秒增加到9. 59秒,但对大表就不可接受了,如partsupp表原来只要1分31秒,加了主外键和索引后需要3分45秒。带约束和索引的加载操作对内存要求较高,tpch最大的orders和lineitem表在4G内存时都加载失败了。如果只添加主键约束还是能导入成功的,增加的时间也很有限,可见耗费资源的操作主要还是创建索引。需要说明的是,我们的测试服务器并不满足VectorWise 2.5的最小配置:8GB内存,因此出现这些情况并不完全是数据库软件本身的问题。
* \g
Executing . . .
E_US081C Syntax error. Last symbol read was: 'truncate'.
(Sat Sep 01 21:58:27 2012)
continue
* drop table part_col;
* \g
Executing . . .
* CREATE TABLE PART_COL ( P_PARTKEY INTEGER NOT NULL,
* P_NAME VARCHAR(55) NOT NULL,
* P_MFGR CHAR(25) NOT NULL,
* P_BRAND CHAR(10) NOT NULL,
* P_TYPE VARCHAR(25) NOT NULL,
* P_SIZE INTEGER NOT NULL,
* P_CONTAINER CHAR(10) NOT NULL,
* P_RETAILPRICE DECIMAL(15,2) NOT NULL,
* P_COMMENT VARCHAR(23) NOT NULL )\g
Executing . . .
continue
* ALTER TABLE PART_COL ADD PRIMARY KEY (P_PARTKEY);
* \g
Executing . . .
continue
* select local_time;
* insert into PART_COL select * from part ;
* select local_time;
* \g
Executing . . .
+-------------------------------+
|col1 |
+-------------------------------+
|22:09:53.760938 |
+-------------------------------+
(1 row)
(2000000 rows)
+-------------------------------+
|col1 |
+-------------------------------+
|22:10:03.354955 |
+-------------------------------+
(1 row)
continue
* create index ps_fk1 on partsupp(PS_SUPPKEY);
* \g
Executing . . .
(0 rows)
continue
* create index ps_fk2 on partsupp(PS_PARTKEY);
* \g
Executing . . .
E_QE0312 A cluster index already exists on Vectorwise table 'partsupp'.
(Sat Sep 01 22:38:59 2012)
(0 rows)
continue
--创建主外键约束和添加外键列索引后
C:\Users\db2admin>load2 partsupp
C:\Users\db2admin>time 0<cr
当前时间: 10:58:52.80
输入新时间:
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table partsupp tpch2 C:\Users\db2adm
in\pgsql\partsupp.txt
loading
processed 8000000 records, loaded 8000000 records, 0 errors
C:\Users\db2admin>time 0<cr
当前时间: 11:02:37.69
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table orders tpch2 C:\Users\db2admin
\pgsql\orders.txt
loading
query not accepted by server
Commit failed
processed 15000000 records, loaded 15000000 records, 0 errors
--如果只创建主键约束
* create table lineitem_2 as select * from lineitem;
* \g
Executing . . .
(0 rows)
continue
* ALTER TABLE LINEITEM_2
* ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
* \g
Executing . . .
continue
* \q
Your SQL statement(s) have been committed.
Vectorwise Version VW 2.5.1 (a64.win/162) logout
Mon Sep 03 06:43:40 2012
C:\Users\db2admin>load3 lineitem
C:\Users\db2admin>time 0<cr
当前时间: 18:44:40.96
C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table lineitem_2 tpch2 C:\Users\db2admin\pgsql\lineitem.txt
loading
processed 59986052 records, loaded 59986052 records, 0 errors
C:\Users\db2admin>time 0<cr
当前时间: 18:51:16.53
(二)数据查询
下面各个测试项目列出的均是采用系统默认参数的结果。
1. tpch查询测试
产生数据源的软件是已经编译为可执行文件的Tcp-h_windows.zip,版本是2.1.8,可以从http://www.pilhokim.com/index.php?title=Project/EFIM/TPC-H下载。采用dbgen -s10生成一套10GB规模的数据,用qgen产生查询SQL语句,只针对VectorWise数据库作语法修改,尽量不改变语句的结构。主要变动是修改limit关键字为first关键字,并把它移到select字段列表的前面,另外,为了更加精确的计时,没有采用只精确到整数秒的命令行工具的\t命令,而采用插入select local_time的方式,可以精确到毫秒。
VectorWise建议在数据表中数据有较大比例(大于10%)的数据发生变化以后,重新执行optimizedb命令收集统计信息,-zfq选项能加速直方图的收集。
分别在优化前和优化后执行查询的数据。优化(统计分析)用时大约1分钟。
Sat Aug 04 20:53:27 2012
C:\Program Files\Actian\VectorwiseVW\ingres\bin>sql tpch <C:\Users\db2admin\downloads\tpch_vwqep.txt >C:\Users\db2admin\downloads\tpch_vwqep
.log
C:\Program Files\Actian\VectorwiseVW\ingres\bin>optimizedb -zfq tpch
I_OP0958 Row count for table 'customer' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'lineitem' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'nation' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'orders' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'part' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'partsupp' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'region' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'supplier' not available from catalogs. Counting rows.
I_OP0958 Row count for table 'tmp' not available from catalogs. Counting rows.
C:\Program Files\Actian\VectorwiseVW\ingres\bin>sql tpch <C:\Users\db2admin\downloads\tpch_vwqep.txt >C:\Users\db2admin\downloads\tpch_vwqep
_after_opt.log
查看优化前和优化后的数据。优化前大约需要36秒,优化后只要33秒。
---------- TPCH_VWQEP.LOG
|2012-08-04 20:54:30.023285-04:00 |
|2012-08-04 20:54:32.800090-04:00 |
|2012-08-04 20:54:33.408491-04:00 |
|2012-08-04 20:54:34.609693-04:00 |
|2012-08-04 20:54:35.935695-04:00 |
|2012-08-04 20:54:37.480098-04:00 |
|2012-08-04 20:54:37.682898-04:00 |
|2012-08-04 20:54:38.681300-04:00 |
|2012-08-04 20:54:40.397303-04:00 |
|2012-08-04 20:54:42.877707-04:00 |
|2012-08-04 20:54:45.092911-04:00 |
|2012-08-04 20:54:45.311312-04:00 |
|2012-08-04 20:54:47.261315-04:00 |
|2012-08-04 20:54:51.644923-04:00 |
|2012-08-04 20:54:54.094127-04:00 |
|2012-08-04 20:54:54.920929-04:00 |
|2012-08-04 20:54:55.638530-04:00 |
|2012-08-04 20:54:56.480931-04:00 |
|2012-08-04 20:55:00.396538-04:00 |
|2012-08-04 20:55:01.114139-04:00 |
|2012-08-04 20:55:02.237341-04:00 |
|2012-08-04 20:55:05.263747-04:00 |
|2012-08-04 20:55:05.996948-04:00 |
C:\Downloads>find "2012-08" tpch_vwqep_after_opt.log
---------- TPCH_VWQEP_AFTER_OPT.LOG
|2012-08-04 20:57:27.145996-04:00 |
|2012-08-04 20:57:29.688800-04:00 |
|2012-08-04 20:57:29.969601-04:00 |
|2012-08-04 20:57:31.326803-04:00 |
|2012-08-04 20:57:32.699606-04:00 |
|2012-08-04 20:57:34.056808-04:00 |
|2012-08-04 20:57:34.181608-04:00 |
|2012-08-04 20:57:34.883610-04:00 |
|2012-08-04 20:57:36.084812-04:00 |
|2012-08-04 20:57:38.549616-04:00 |
|2012-08-04 20:57:40.967620-04:00 |
|2012-08-04 20:57:41.154821-04:00 |
|2012-08-04 20:57:43.307624-04:00 |
|2012-08-04 20:57:47.613232-04:00 |
|2012-08-04 20:57:50.140436-04:00 |
|2012-08-04 20:57:50.951638-04:00 |
|2012-08-04 20:57:51.684839-04:00 |
|2012-08-04 20:57:52.168440-04:00 |
|2012-08-04 20:57:54.929645-04:00 |
|2012-08-04 20:57:55.725246-04:00 |
|2012-08-04 20:57:56.614448-04:00 |
|2012-08-04 20:57:59.204052-04:00 |
|2012-08-04 20:57:59.968454-04:00 |
这里选择去年评测结果最快的列式数据库VectorWise 1.5和VectorWise 2.5作一个对比(字体加粗者为VectorWise 2.5时间更短的结果)。可见对于经过统计分析的表,在10G这个数据量,目前在测试中VectorWise 2.5是无敌的。何况这是完全没有对系统参数进行修改的情况下执行的。如果经过有经验的用户的调整,可望获得更好的结果。实际测试表明,添加了主外键和外键上的索引后,对查询结果的影响微乎其微,既没有提高,也没有下降。故不再单独列出。
原始tpch scala=10测试记录 (单位:秒)
Query | VectorWise 1.5 | VectorWise 2.5(优化前) | VectorWise 2.5(优化后) |
1 | 0.651289 | 2.777 | 2.543 |
2 | 0.145184 | 0.608 | 0.281 |
3 | 2.1528 | 1.202 | 1.357 |
4 | 3.12139 | 1.326 | 1.373 |
5 | 1.45904 | 1.544 | 1.357 |
6 | 0.128153 | 0.203 | 0.125 |
7 | 1.14407 | 0.998 | 0.702 |
8 | 0.824642 | 1.716 | 1.201 |
9 | 3.36685 | 2.481 | 2.465 |
10 | 3.14761 | 2.215 | 2.418 |
11 | 0.110343 | 0.218 | 0.187 |
12 | 0.848261 | 1.950 | 2.153 |
13 | 1.58433 | 4.384 | 4.305 |
14 | 0.414913 | 2.449 | 2.527 |
15 | 0.225124 | 0.827 | 0.812 |
16 | 2.32214 | 0.718 | 0.733 |
17 | 0.304058 | 0.842 | 0.483 |
18 | 4.3753 | 3.916 | 2.762 |
19 | 0.734187 | 0.717 | 0.795 |
20 | 2.61108 | 1.123 | 0.889 |
21 | 13.5403 | 3.027 | 2.590 |
22 | 0.39558 | 0.733 | 0.764 |
总计 | 43.606644 | 35.974 | 32.822 |
我们看到,VectorWise 2.5对所有的原始脚本都能执行,各种连接和子查询的支持都SQL标准支持的date''、interval''和extract from用法。基本没有执行特别慢的语句,所有查询都能在5秒以内完成。比起老版本,有一半的查询更快(尽管前文提到过由于硬件差别巨大、不具有可比性)。优化前后时间绝对差距不大,但从相对比例来看,又提高了10%。不过仍需看到,有些查询优化后反而略慢,如果Vectorwise能继续改进,应该还能取得更好的成绩。
下面是具有可比性的同一个Linux环境(硬件配置参考去年评测文章)下的两种版本分别在优化收集统计信息前后的查询对比:(各列中不带no的是优化后结果)。这个结果显示,在同等条件下,2.5版比1.5版的查询速度提高了100%之多。只有前面提到的在4G内存下优化前不能执行的第5个查询优化前速度明显不如1.5版,这可能是一个bug。
五、小结
综上所述,VectorWise 2.5是一款功能较全面、性能较强大、兼容性较好的列式数据库软件,特别是查询性能比起上一代版本有了大幅度提升。完全可以进入主流用户市场,值得推荐。如果能在对添加索引和约束方面减少限制,在truncate表、递归with子查询、group by扩展等方面再作些改进就更好用了。
另外,需要指出的是,VectorWise软件的支持社区值得表扬,对问题的响应非常快,虽然我只是评估版用户,同样热心地解答我提出的问题,也基本上都得到了满意的结果,有了他们的帮助,我才能完成这次测评。在此,向他们表示衷心感谢。