技术开发 频道

列式数据库Actian VectorWise 2.5评测

  【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文件,允许安装文件对系统更改后就进入安装向导画面。

测试平台及VectorWise的安装步骤

  接受许可协议后,进入安装模式选择界面:

测试平台及VectorWise的安装步骤

  在这里我们选择Advanced,以便对一些默认设置进行用户定制。

测试平台及VectorWise的安装步骤

  因为VectorWise支持安装多个实例,所以需要为安装实例命名实例ID,以便区分。

测试平台及VectorWise的安装步骤

  在组件选择界面,我们选择“Complete”,即安装全部组件。

测试平台及VectorWise的安装步骤

  安装目的位置及实例位置的选择,这里采用默认值。

测试平台及VectorWise的安装步骤

  接下来是数据块、内存和并行度的配置,这里需要根据用户机器的情况进行设置。

测试平台及VectorWise的安装步骤

${PageNumber}

  然后确定是否在操作系统启动时自动VectorWise服务,以及配置时区,注意并不存在中国的时区,看来Actian公司还没有准备占领中国市场。

测试平台及VectorWise的安装步骤

  最后确定将VectorWise的安装路径加入系统搜索路径。这样可以方便地运行各种VectorWise的命令行工具。

测试平台及VectorWise的安装步骤

  在总结页面可以观察到所有的安装设置,确认无误后点击Install进行实际安装。

测试平台及VectorWise的安装步骤

  软件安装结束后,安装程序自动对数据库进行配置。这个过程的时间有点长,但全是自动操作,没有用户可干预的过程,稍事等待后就出现如下的安装完毕界面。

测试平台及VectorWise的安装步骤

  可以观察到,VectorWise服务已经启动,在系统任务栏右下角托盘中出现一个标志。右击该标志,可以在弹出的功能菜单中进行各种操作。

测试平台及VectorWise的安装步骤

  (二)创建数据库

  启动VectorWise服务后,就可以用createdb命令创建数据库了,我们使用安装VectorWise的用户创建数据库。

C:\Program Files\Actian\VectorwiseVW\ingres\bin>createdb tpch
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语句。

C:\Program Files\Actian\VectorwiseVW\ingres\bin>sql tpch
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写法。

* select first 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)
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个查询。

select
        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等子句中。下面举例说明分析函数,首先创建一个测试表。

C:\Program Files\Actian\VectorwiseVW\ingres\bin>sql tpch
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子句中使用分析函数的例子。

* select empno,name,rank()over(order by name)rk from emp;
* \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子句。

* select empno,name,sum(empno)over(order by length(name) desc)rk from emp;
* \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)
${PageNumber}

  4.支持With子查询CTE(公用表表达式)

  Vectorwise支持With子查询CTE(公用表表达式)。但虚表必须从实际表或在前面已经定义的虚表中选择,否则报表不存在的错误信息。不支持递归CTE

* with t as(select * from emp)select * from t where empno=1
* \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个,但前后缀空格被删除。

* select squeeze(' Long    long ago,  there is a        King   ')t;
* \g
Executing . . .


+---------------------------------------------+
|t                                            |
+---------------------------------------------+
|
Long long ago, there is a King               |
+---------------------------------------------+
(
1 row)
continue

  2) SUBSTRING_INDEX函数返回一个字符串中分隔字符的第n次出现为止的子串。

  它的参数格式是SUBSTRING_INDEX(str,delim,count)。

  但这个函数的第一个参数只对Vectorwsie类型的表中的列有效,而对文本字面量未实现,文档43页中的例子是错误的。

* SELECT SUBSTRING_INDEX('www.actian.com', '.', 2);
* \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,它既输出执行计划,也输出执行结果。

* select count(*) from part_col where p_partkey in(select p_partkey from part_col where p_name like 'A%') with qep;
* \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命令的输出结果上。

C:\Users\db2admin\pgsql\bin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwinfo" --help
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数据库名,那么输出关于数据库的信息。

C:\Users\db2admin\pgsql\bin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwinfo" -s tpch
+--------------------------------+--------------------------------------------+
|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:\Users\db2admin\pgsql\bin>dir ..\*.txt
驱动器 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:\Users\db2admin\pgsql\bin>dir "C:\Program Files\Actian\VectorwiseVW\ingres\data\vectorwise\tpch\CBM\default"
驱动器 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数据库执行

C:\Users\db2admin>sql 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

  如果忘记将用途类型用括号括起来,将会报语法错误。

* create location temp_loc with  area= 'C:\Users\db2admin\Downloads\temp' usage=work;
* \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执行,会出错

* create location temp_loc with  area = 'C:/Users/db2admin/Downloads/temp' , usage = (work);\g
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下使用位置要特别注意,如果把\写成了/,也会出错,而且这个错误提示信息是很隐晦的。

C:\Users\db2admin>sql iidbdb
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结束指在不输入内容的前提下按下一个回车符,因为一个位置可以被多个数据库识别,工具依靠这个来判断所有的数据库名都输入完毕了。

* \q
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.连接到要使用位置的数据库创建表并插入数据

C:\Users\db2admin>sql tpch2
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变量指定的默认存储位置

* create table test_loc (id int,name varchar(1000))with location(name)=(temp_loc);\g
Executing . . .

continue
*

  下面这个命令创建的表所有列都用刚才创建并添加到数据库的位置存储

* create table test_loc2 (id int,name varchar(1000))with location=(temp_loc);\g
Executing . . .

continue
*
* insert into test_loc values(1,'name1');
* insert into test_loc2 values(1,'name1');
* \g
Executing . . .

  所创建的位置在操作系统文件系统上的布局如下:

C:\Users\db2admin\pgsql\bin>tree C:\Users\db2admin\Downloads\temp
文件夹 PATH 列表
卷序列号为 3CE2
-73F3
C:
\USERS\DB2ADMIN\DOWNLOADS\TEMP
└─ingres
    ├─data
    │  ├─default
    │  │  └─tpch2
    │  └─vectorwise
    │      └─tpch2
    └─work
        ├─default
        └─vectorwise

  如果要查看当前数据库使用的位置情况,用infodb命令,所有存储位置都列在输出的底部位置。

C:\Users\db2admin\pgsql\bin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\infodb"  tpch2
==================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
================================================================================
${PageNumber}

  2.数据库多版本共存

  有时候,我们在升级数据库版本之前,想要在测试环境同时安装两种版本的数据库,这样就可以测试在同等条件下,新版本比起旧版本有哪些改进。Vectorwise提供了这种功能,它是通过对不同版本的数据库实例采用不同的实例名来实现的。由于条件限制,我们在去年测试Vectorwise的Linux环境中举例。

  安装第二个Vectorwise实例是通过执行ingres_express_install.sh脚本实现的,它的命令行语法是:

  ingres_express_install.sh [-respfile文件名] [安装ID] [安装根路径]

  其中安装ID是一个包含两个字符的字符串,第一个字符必须是大写字母,第二个字符可以大写字母或数字,它对于安装第二个实例是必须的,因为第一个实例一般占用了VW安装ID。安装ID和安装根路径必须和第一个实例的不同。

  Vectorwise的Linux安装包有两种格式,rpm格式和ingbuild格式,其中rpm格式不支持升级也不支持新旧版本共存,如果输入安装命令,会提示出错。

[root@redflag11012602 vectorwise-2.5.1-162-NPTL-eval-linux-rpm-x86_64]# ./ingres_express_install.sh TF /user1/app/vw25
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版本是支持多版本的。同样输入前面的命令行就可以成功安装。

[root@redflag11012602 vectorwise-2.5.1-162-NPTL-eval-linux-ingbuild-x86_64]# ./ingres_express_install.sh TF /user1/app/vw25
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,文件的内容如下:

root@redflag11012602 ingres]# cat .ingTFsh
# 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的例子。

[root@redflag11012602 ingres]# su - ingres
[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
*
${PageNumber}

  四、性能测试

  测试项目包含二方面,第一是加载,数据仓库要处理的数据量巨大,数据加载能力是选择数据库软件要考虑的重要因素之一,我们将测试包括外部文本数据加载和从数据库内部抽取部分数据到其他表的性能。加载之后再顺便了解压缩,数据压缩时常被作为列式存储数据库的一个卖点来宣传,因此我们单独把它列出。第二是测试重点,数据查询,采用tpc-h 的数据和查询语句,数据规模是scala=10。

  (一)数据加载

  1. 从外部文本文件导入

  首先执行脚本创建表结构,命令格式如下:

C:\Program Files\Actian\VectorwiseVW\ingres\bin>sql tpch <C:\Users\db2admin\Downloads\dssvw.ddl
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等转义符写法。但不支持多个字节分隔符。

C:\Users\db2admin>"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "|\n" --table nation tpch C:\Users\db2admin\Downloads\Tpc-h_windows\nation.tbl
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可以解决这个问题。

#include <stdio.h>
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

time <cr
"C:\Program Files\Actian\VectorwiseVW\ingres\bin\vwload" --fdelim "|" --rdelim "\n" --table %1 tpch C:\Users\db2admin\pgsql\%1.txt
time <cr

  这个批处理文件接受一个表名参数,自动将参数添加到命令行的相应位置。装载8个表的日志如下:

C:\Users\db2admin>load nation

当前时间:
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的全部选项,供参考。

[ingres@redflag11012602 ~]$ vwload --help
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
${PageNumber}

  2. 从数据库内部抽取数据到其他表

  数据库从库内转移数据的方法,VectorWise支持create table new as select * from org这种方式。表的存储类型支持默认的列式,也支持指定WITH STRUCTURE = VECTORWISE_ROW选项创建行式存储表。

  我们从part表复制所有记录保存到part_row行式存储表,用时是13秒。比vwload工具导入还快了大约1秒。而同样的数据保存到part_col列式存储表,用时是9.5秒,比行式存储又快了近4秒。

* select local_time;
* 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内存,因此出现这些情况并不完全是数据库软件本身的问题。

* truncate table part_col;
* \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
${PageNumber}

  (二)数据查询

  下面各个测试项目列出的均是采用系统默认参数的结果。

  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分钟。

Vectorwise Version VW 2.5.1 (a64.win/162) logout
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秒。

C:\Downloads>find "2012-08" tpch_vwqep.log

---------- 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。

数据查询:tpch查询测试

  五、小结

  综上所述,VectorWise 2.5是一款功能较全面、性能较强大、兼容性较好的列式数据库软件,特别是查询性能比起上一代版本有了大幅度提升。完全可以进入主流用户市场,值得推荐。如果能在对添加索引和约束方面减少限制,在truncate表、递归with子查询、group by扩展等方面再作些改进就更好用了。

  另外,需要指出的是,VectorWise软件的支持社区值得表扬,对问题的响应非常快,虽然我只是评估版用户,同样热心地解答我提出的问题,也基本上都得到了满意的结果,有了他们的帮助,我才能完成这次测评。在此,向他们表示衷心感谢。

0
相关文章