技术开发 频道

主流列式数据库评测:Sybase IQ

  【IT168 专稿】在上一系列文章中,我们介绍了Gbase 8a,Infobright,InfiniDB, MonetDB等4种列式数据库,并将它们在数据仓库方面的性能,利用tpc-h模型scala=1的数据作了测试,并和传统行存储的Oracle数据库作了对比,得到了一些结论。得到一些读者的回应。这一次,我们将介绍另一种重要的主流商业列存储数据库Sybase IQ 15.2版的功能特点,并扩大性能测试的范围至tpc-h scala=10,ssb (星型模式)scala=10数据,试图得出一个更有代表性的令人信服的结论,为用户选型提供参考。

  系列文章回顾:

  主流列式数据库评测:InfiniDB和MonetDB

  主流列式数据库评测之Infobright

  主流列式数据库评测:南大通用GBase 8a

  一、测试平台

  本次测试基于Intel Xeon 7550*8的PC服务器上用VMWare VSphere 4.1管理的虚拟机,虚拟机的逻辑CPU个数是8,内存100GB,存储为8个300GB SAS本地磁盘,采用一块512M缓存RAID卡,按RAID5方式组成磁盘阵列。操作系统采用和RHEL 5相同的核心级别的Red Flag Asian Linux Sever 3.0 x64。相比前次测试,这一配置的内存更大、IO更快,但CPU稍弱。由于Linux是互联网公司常用的服务器操作系统,因此这一测评,对更大范围的用户也有参考价值。

  二、安装

  (一) Sybase IQ的安装步骤

  下面重点讲述Sybase IQ的安装,评估版安装包从http://www.sybase.com/iq获取,选择Sybase IQ 15.2 Linux x86-64 ,文件名是iq152_linux64.tgz,大约380MB,和Windows版一样,同时包含了基于Java的图形界面管理工具和基于字符终端的命令行工具,本文主要以基于字符终端的命令行操作为主。另外,Sybase已经发布了15.2版的ESD #2,包含了大量的更新和修正,需要有权限的用户才能获取。

  Sybase IQ的安装有两种方式,图形安装和静默安装,图形安装方式非常简单,完全类似于常用的Windows软件安装方式,几乎不需要更改就能顺利完成;静默安装主要是针对远程登陆的客户提供,比图形方式略微复杂,相对Oracle要容易很多。同时Sybase 公司主页提供了详细的中文文档资料,参见http://infocenter.sybase.com/help/topic/com.sybase.infocenter.help.iqzh.15.2/title.htm,有了它的指导,安装可以少走很多弯路,比较顺利地进行下去。

  将下载回来的安装包解压到临时目录,可以观察到安装文件的目录结构,其中sysam_server-2_20是授权管理服务器,sysam_utils-2_20是授权管理工具,SilentInstall_zh.txt是静默安装需要的中文版响应文件。目前仅提供英语、汉语和日语的响应文件,也可看出Sybase公司的市场策略。

[root@redflag11012601 app]# ll
-rw-r--r-- 1 root root 391058852 02-06 10:47 iq152_linux64.tgz
[root@redflag11012601 app]# mkdir tmp
[root@redflag11012601 app]# cd tmp
[root@redflag11012601 tmp]# tar zxf ..
/iq152_linux64.tgz
[root@redflag11012601 tmp]# ll
总计
321596
drwxrwxrwx
3 105 200      4096 2010-05-19 archives
drwxrwxrwx
8 105 200      4096 2010-05-19 jre-6_0
drwxrwxrwx
4 105 200      4096 2010-05-19 License
drwxrwxrwx
3 105 200      4096 2010-05-19 LicensePanel
-rwxrwxrwx 1 105 200        12 2010-08-05 media.inf
-rwxrwxrwx 1 105 200     70656 2010-08-05 media.ssh
-rwxrwxrwx 1 105 200       285 2010-08-05 readme_ja.txt
-rwxrwxrwx 1 105 200       315 2010-08-05 readme.txt
-rwxrwxrwx 1 105 200       178 2010-08-05 readme_zh.txt
-rwxrwxrwx 1 105 200 328792701 2010-08-05 setup.jar
-rwxrwxrwx 1 105 200      6853 2010-08-05 setupLinux64
-rwxrwxrwx 1 105 200     10184 2010-08-05 SilentInstall_ja.txt
-rwxrwxrwx 1 105 200      6176 2010-08-05 SilentInstall.sh
-rwxrwxrwx 1 105 200      9954 2010-08-05 SilentInstall.txt
-rwxrwxrwx 1 105 200      8600 2010-08-05 SilentInstall_zh.txt
-rwxrwxrwx 1 105 200      2726 2010-08-05 SilentUninstall_ja.txt
-rwxrwxrwx 1 105 200      1949 2010-08-05 SilentUninstall.sh
-rwxrwxrwx 1 105 200      2652 2010-08-05 SilentUninstall.txt
-rwxrwxrwx 1 105 200      2405 2010-08-05 SilentUninstall_zh.txt
drwxrwxrwx
3 105 200      4096 2010-05-19 sysam_server-2_20
drwxrwxrwx
3 105 200      4096 2010-05-19 sysam_utils-2_20
drwxrwxrwx
2 105 200      4096 2010-05-19 thirdparty
[root@redflag11012601 tmp]# cat SilentInstall_zh.txt
########################### 静默安装程序 ##################################################################################################

  因为我们用字符显示终端执行安装,因此需要用到静默安装响应文件。

  准备工作的第一项是检查系统存在的库和SybaseIQ要安装的库是否存在冲突,将冲突的库改名。

[root@redflag11012601 tmp]# ll /usr/lib/libodbc.so
lrwxrwxrwx
1 root root 16 01-18 14:34 /usr/lib/libodbc.so -> libodbc.so.1.0.0
[root@redflag11012601 tmp]# mv
/usr/lib/libodbc.so  /usr/lib/libodbc.orig.so
[root@redflag11012601 tmp]# ll
/usr/lib/libodbc.so.1
lrwxrwxrwx
1 root root 16 01-18 14:34 /usr/lib/libodbc.so.1 -> libodbc.so.1.0.0
[root@redflag11012601 tmp]# mv
/usr/lib/libodbc.so.1 /usr/lib/libodbc.orig.so.1

  然后检查系统核心参数的信号量与安装最小要求相比是否足够大,如果不够大,要进行修改。

[root@redflag11012601 tmp]# cat /proc/sys/kernel/sem
256     32000   100     142

  修改方法是用vi打开/etc/sysctl.conf,在末尾增加一行kernel.sem = 250 32000 32 4096并保存退出。

[root@redflag11012601 tmp]# vi /etc/sysctl.conf
"
/etc/sysctl.conf" 55L, 1419C 已写入

  为了不重启系统继续安装,用下面命令使新的参数立即生效。

[root@redflag11012601 tmp]# echo 250 32000 32 4096 > /proc/sys/kernel/sem

  再用下面的命令查询依赖包是否存在,并且是指定的版本。如果缺少,需要安装。一般在安装Linux时选择完全安装就不会有问题。

[root@redflag11012601 tmp]# rpm -q ncurses
ncurses
-5.5-24.20060715.1AX
ncurses
-5.5-24.20060715.1AX
[root@redflag11012601 tmp]# rpm -q -a | grep compat
compat
-readline43-4.3-3
compat
-glibc-2.3.4-2.26
compat
-gcc-34-3.4.6-5AXS3
..

  准备工作完成后,首先安装的是授权管理服务器,Sybase IQ使用专门的工具管理授权文件,不同的授权文件限定用户使用的组件不同,我们安装的评估版无需一个专门的授权文件,在30日评估期内可以测试完整的功能。

  进入授权管理服务器安装子目录,执行setup.bin,按照提示选择显示语言种类。这里我们选择英语。

[root@redflag11012601 tmp]# cd sysam_server-2_20
[root@redflag11012601 sysam_server-2_20]# ll
总计
9952
drwxrwxrwx
2 105 200     4096 2010-05-19 archives
-rwxrwxrwx 1 105 200 10164406 2010-08-05 setup.bin
-rwxrwxrwx 1 105 200      751 2010-08-05 SySAMLicenseServer.lic
[root@redflag11012601 sysam_server-2_20]# ./setup.bin
Preparing
to install...
Extracting the installation resources
from the installer archive...
Configuring the installer
for this system's environment...

Launching installer...


Graphical installers are not supported by the VM. The console mode will be used instead...

Preparing CONSOLE Mode Installation...

===============================================================================
Choose Locale...
----------------

    1- English
  ->2- 简体中文

CHOOSE LOCALE BY NUMBER: 1

  Sybase IQ软件的本地化工作做得不错,尽管选择英文安装界面,但国家区域选择中国,仍然显示中文授权协议。

===============================================================================
End-user license agreement
--------------------------

1)  Americas (Mid/So.) and Asia Pacif  2)  Argentina
3)  Australia                          4)  Belgium(English)
5)  Brazil                             6)  Canada
7)  Denmark                            8)  Europe,Middle East, and Africa - G
9)  France(English)                    10) France(French)
11) Germany(English)                   12) Hong Kong
13) India                              14) Italy(English)
15) Italy(Italy)                       16) Japan
17) Korea                              18) Malaysia
19) Mexico                             20) Netherlands
21) New Zealand                        22) Norway
23) People's Republic of China(PRC)    24) Singapore
25) Spain(English)                     26) Spain(Spanish)
27) Sweden                             28) Switzerland(English)
29) Taiwan                             30) United Kingdom
31) United States of America           32) Any Other Locations

Please enter the number of the location you are installing. (1-32) (DEFAULT:
   1): 23

许可协议

中华人民共和国
20071201

  接受许可协议后安装程序提示安装到的路径,这里接受默认的路径。

===============================================================================
Choose Install Folder
---------------------

Where would you like to install?

  Default Install Folder: /opt/sybase

ENTER AN ABSOLUTE PATH, OR PRESS
<ENTER> TO ACCEPT THE DEFAULT
      :
The directory /opt/sybase does not exist. Do you want to create it?
    (Y/N): Y

  安装类型选择典型安装。系统检查所需要的空间是否满足。

===============================================================================
Choose Install Set
------------------

Please choose the Install Set to be installed by this installer.

  ->1- Typical

    2- Customize...

ENTER THE NUMBER FOR THE INSTALL SET, OR PRESS
<ENTER> TO ACCEPT THE DEFAULT
   :



===============================================================================
Pre-Installation Summary
------------------------

Please Review the Following Before Continuing:

Product Name:
    SySAM License Server

Install Folder:
    /opt/sybase

Product Features:
    SySAM License Server

Disk Space Information (for Installation Target):
    Required:  7,099,539 bytes
    Available: 14,781,878,272 bytes

PRESS
<ENTER> TO CONTINUE:

  如果空间没有问题,安装程序再次提示用户确认安装的路径。

===============================================================================
Ready To Install
----------------

InstallAnywhere is now ready to install SySAM License Server onto your system
at the following location:

   /opt/sybase

PRESS
<ENTER> TO INSTALL:

  开始安装后,有一个进度条提示安装进程。

===============================================================================
Installing...
-------------

[==================|==================|==================|==================]
[------------------|------------------|------------------|------------------]

  安装完成,按回车键退出。

===============================================================================
Install Complete
----------------

The installation
of SySAM License Server is complete, but some errors occurred
during the install.
   Please see the installation
log for details.  Press "Done" to quit the
installer.

PRESS
<ENTER> TO EXIT THE INSTALLER:

  安装了授权管理服务器,接着还要安装授权管理工具,它的安装步骤与前者雷同,就不详细描述了。

[root@redflag11012601 tmp]# cd sysam_utils-2_20
[root@redflag11012601 sysam_utils-2_20]# ./setup.bin

  下面开始安装IQ软件。首先要设定环境变量和用户、组。在Unix/Linux安装过Oracle的读者会觉得很熟悉这些步骤。

  用户需要用vi 查看静默安装响应文件SilentInstall_zh.txt,确保如下三行没有被注释。其它安装选项可以不作修改。

-W sysamLicense.proceedWithoutLicense=true
-W sysamProductType.productEdition="EE"
-W sysamProductType.licenseType="EV"

  如果需要修改,修改后保存退出vi。

  输入下面的命令行执行安装。安装路径仍然是选择/opt/sybase。

[root@redflag11012601 tmp]# ./SilentInstall.sh -txt ./SilentInstall_zh.txt -eval_user -I_accept_sybase_license -dst /opt/sybase

Log file is located at: /tmp/IQ15Console14672.log

  静默安装没有任何提示,所有配置记录到安装日志文件。可以用vi查看安装日志文件。

  我们查看默认安装目录,可以看到IQ软件已经被安装到/opt/sybase。

[root@redflag11012601 tmp]# ll /opt/sybase
总计 164
drwxr-xr-x 58 root root  4096 02-06 14:20 charsets
drwxr-xr-x  3 root root  4096 02-06 14:20 collate
drwxr-xr-x  2 root root  4096 02-06 14:20 config
drwxr-xr-x 18 root root  4096 02-06 14:20 IQ-15_2
drwxr-xr-x 11 root root  4096 02-06 14:20 jConnect-6_0
drwxr-xr-x  8 root root  4096 02-06 14:20 _jvmIQ
drwxr-xr-x 14 root root  4096 02-06 14:20 locales
drwxr-xr-x  2 root root  4096 02-06 14:11 log
-rwxr-xr-x  1 root root 99751 02-06 14:20 log.txt
drwxr-xr-x  6 root root  4096 02-06 14:20 shared
drwxr-xr-x  2 root root  4096 02-06 14:03 Sybase_Install_Registry
drwxr-xr-x  3 root root  4096 02-06 14:03 sybuninstall
drwxr-xr-x  6 root root  4096 02-06 14:11 SYSAM-2_0
drwxr-xr-x  2 root root  4096 02-06 14:20 ThirdPartyLegal
drwxr-xr-x  3 root root  4096 02-06 14:20 uninstall
drwxr-xr-x  3 root root  4096 02-06 14:18 _vpdIQ
 

  (二)创建数据库

  IQ软件安装完毕后需要创建数据库。Sybase强烈建议用户在生产环境中建立独立的数据库和表空间,这里为了简单起见,我们借用IQ自带的demo数据库。

  设定环境变量SYBASE为sybase的安装根目录,并执行脚本以设定其它IQ系统环境变量。

[root@redflag11012601 tmp]# export SYBASE=/opt/sybase
[root@redflag11012601 tmp]# . $SYBASE/IQ-15_2/IQ-15_2.sh

  demo数据库安装脚本位于IQ安装目录的demo子目录,里面有具体创建数据库和启动数据库所需的各种SQL语句和命令。感兴趣的读者可以自行参阅。

[root@redflag11012601 tmp]# cd  $IQDIR15/demo
[root@redflag11012601 demo]# ll
总计 64
drwxr-xr-x 2 root root  4096 02-06 14:20 adata
drwxr-xr-x 2 root root  4096 02-06 14:20 demodata
-rwxr-xr-x 1 root root 15652 2009-02-21 mkasiqdemo.sql
-rwxr-xr-x 1 root root  9441 2009-10-23 mkiqdemo.sh
-rwxr-xr-x 1 root root 27139 2009-02-20 mkiqdemo.sql

  运行mkiqdemo.sh脚本创建demo数据库。回答Y继续创建。创建过程实际上分为2步,第一步是启动SybaseIQ系统自带的工具数据库utility_db。第二步是在连接上utility_db数据库后执行create database等语句创建demo数据库。创建成功后关闭工具数据库。

[root@redflag11012601 demo]# ./mkiqdemo.sh

This script will create the iqdemo database in the current
directory.  An existing iqdemo database in this directory
will need to be shutdown and over-written.

Continue
<Y/N>? Y
Checking system ...

There are no servers running on this system


Starting Server ...


Starting server bld_demo_9262 on redflag11012601 at port 9262 (02/06 14:40:10)

Run Directory       : /opt/sybase/IQ-15_2/demo
Server Executable   : /opt/sybase/IQ-15_2/bin64/iqsrv15
Server Output Log   : /opt/sybase/IQ-15_2/logfiles/bld_demo_9262.0001.srvlog
Server Version      : 15.2.0.5604/GA
Open Client Version : 15.0/P-EBF16082 ESD #15
User Parameters     : '@bld_demo_9262.cfg'
Default Parameters  : -gc 20 -gl all -ti 4400 -gn 25

I. 02/06 14:40:12。     Sybase IQ
I. 02/06 14:40:12。      15.2 版
I. 02/06 14:40:12。       (64 位模式)
I. 02/06 14:40:12。版权所有 1992-2010 Sybase, Inc. 保留所有权利
I. 02/06 14:40:12。
I. 02/06 14:40:12。检测到 8 个物理处理器。
I. 02/06 14:40:12。服务器将使用的物理处理器的最大数量: 8
I. 02/06 14:40:12。在 Linux 2.6.18-194.1.AXS3 #1 SMP Fri May 7 10:03:53 CST 2010 上运行 X86_64
I. 02/06 14:40:12。为 X86_64 处理器体系结构建立的服务器
I. 02/06 14:40:12。49152K 内存已用于高速缓存
I. 02/06 14:40:12。最小高速缓存大小: 49152K,最大高速缓存大小: 262144K
I. 02/06 14:40:12。使用 4096 字节的最大页面大小
I. 02/06 14:40:12。数据库服务器在 Sun Feb 06 2011 14:40 启动
I. 02/06 14:40:12。正在尝试启动 SharedMemory 链接...
I. 02/06 14:40:12。    SharedMemory 链接已成功启动
I. 02/06 14:40:12。正在尝试启动 TCPIP 链接...
I. 02/06 14:40:12。正在端口 9262 启动


=============================================================
IQ server starting with:
     10 connections         (       -gm )
     26 cmd resources       ( -iqgovern )
    455 threads             (     -iqmt )
    512 Kb thread stack size   (   -iqtss  )
  232960 Kb thread memory size ( -iqmt * -iqtss )
      8 IQ number of cpus  ( -iqnumbercpus )
      0 MB maximum size of IQMSG file ( -iqmsgsz )
      0 copies of IQMSG file archives ( -iqmsgnum )
=============================================================

I. 02/06 14:40:17。    TCPIP 链接已成功启动
I. 02/06 14:40:17。立即接受请求
新的进程 ID 是 30111

Server started successfully

Started.
Connecting to server via TCPIP ...
Using: uid=DBA;pwd=sql;eng=bld_demo_9262;dbn=utility_db;links=tcpip{host=redflag11012601;port=9262}

Creating database ...
Demo database created.

Shutting down server ...
SQL Anywhere 停止服务器实用程序 版本 11.0.1.5604

-rw-r--r-- 1 root root      563 02-06 14:40 iqdemo.cfg
-r--r--r-- 1 root root  2961408 02-06 14:40 iqdemo.db
-rw-r--r-- 1 root root 26214400 02-06 14:40 iqdemo.iq
-rw-r--r-- 1 root root    40339 02-06 14:40 iqdemo.iqmsg
-rw-r--r-- 1 root root 13107200 02-06 14:40 iqdemo.iqtmp
-rw-r--r-- 1 root root      123 02-06 14:40 iqdemo.lmp
-r-------- 1 root root   327680 02-06 14:40 iqdemo.log
-rw-r--r-- 1 root root 78643200 02-06 14:40 iqdemo_main.iq

Demo database created successfully

 

  见到上述提示信息,表示Demo数据库已经创建完成,下面需要启动该数据库,才能继续其它操作。必须保证当前目录在IQ的demo目录下才能执行下面的命令,其中iqdemo.cfg是配置文件。它的内容包括数据库名、端口等信息。还包括缓存和连接数的设置。

[root@redflag11012601 bin64]# cat /opt/sybase/IQ-15_2/demo/iqdemo.cfg
# iqdemo.cfg
# ------------------------------------------------------------
# Default startup parameters for the ASIQ demo database
# ------------------------------------------------------------

-n  redflag11012601_iqdemo
-x  tcpip{port=2638}

# The following parameters are also found in the configuration file
# /opt/sybase/IQ-15_2/scripts/default.cfg.  Any parameters not specified below
# and not in the start up parameter list, will be added by start_iq
# using default.cfg as a guide.

-c  48m
-gc 20
-gd all
-gl all
-gm 10
-gp 4096

-iqmc 32
-iqtc 24

  我们也可以创建其它的配置文件用于数据库的启动。iqdemo.db是我们上一步创建的数据库文件。启动数据库的命令行是start_iq @配置文件名 数据库文件名。

[root@redflag11012601 demo]# start_iq @iqdemo.cfg iqdemo.db


Starting server redflag11012601_iqdemo on redflag11012601 at port 2638 (02/06 14:40:46)

Run Directory       : /opt/sybase/IQ-15_2/demo
Server Executable   : /opt/sybase/IQ-15_2/bin64/iqsrv15
Server Output Log   : /opt/sybase/IQ-15_2/logfiles/redflag11012601_iqdemo.0001.srvlog
Server Version      : 15.2.0.5604/GA
Open Client Version : 15.0/P-EBF16082 ESD #15
User Parameters     : '@iqdemo.cfg' 'iqdemo.db'
Default Parameters  : -ti 4400 -gn 25

I. 02/06 14:40:47。     Sybase IQ
I. 02/06 14:40:47。      15.2 版
I. 02/06 14:40:47。       (64 位模式)
I. 02/06 14:40:47。版权所有 1992-2010 Sybase, Inc. 保留所有权利
I. 02/06 14:40:47。
I. 02/06 14:40:47。检测到 8 个物理处理器。
I. 02/06 14:40:47。服务器将使用的物理处理器的最大数量: 8
I. 02/06 14:40:47。在 Linux 2.6.18-194.1.AXS3 #1 SMP Fri May 7 10:03:53 CST 2010 上运行 X86_64
I. 02/06 14:40:47。为 X86_64 处理器体系结构建立的服务器
I. 02/06 14:40:47。49152K 内存已用于高速缓存
I. 02/06 14:40:47。最小高速缓存大小: 49152K,最大高速缓存大小: 262144K
I. 02/06 14:40:47。使用 4096 字节的最大页面大小
I. 02/06 14:40:47。在 Sun Feb 06 2011 14:40 启动数据库 "iqdemo" (/opt/sybase/IQ-15_2/demo/iqdemo.db)


=============================================================
IQ server starting with:
     10 connections         (       -gm )
     26 cmd resources       ( -iqgovern )
    455 threads             (     -iqmt )
    512 Kb thread stack size   (   -iqtss  )
  232960 Kb thread memory size ( -iqmt * -iqtss )
      8 IQ number of cpus  ( -iqnumbercpus )
      0 MB maximum size of IQMSG file ( -iqmsgsz )
      0 copies of IQMSG file archives ( -iqmsgnum )
=============================================================

I. 02/06 14:40:48。事务日志: iqdemo.log
I. 02/06 14:40:48。在 Sun Feb 06 2011 14:40 启动检查点 "iqdemo" (iqdemo.db)
I. 02/06 14:40:48。在 Sun Feb 06 2011 14:40 完成了 "iqdemo" (iqdemo.db) 的检查点
I. 02/06 14:40:48。数据库 "iqdemo" (iqdemo.db) 在 Sun Feb 06 2011 14:40 启动
I. 02/06 14:40:48。IQ Server redflag11012601_iqdemo.
I. 02/06 14:40:48。数据库服务器在 Sun Feb 06 2011 14:40 启动
I. 02/06 14:40:48。正在尝试启动 SharedMemory 链接...
I. 02/06 14:40:48。    SharedMemory 链接已成功启动
I. 02/06 14:40:48。正在尝试启动 TCPIP 链接...
I. 02/06 14:40:48。正在端口 2638 启动
新的进程 ID 是 30770
I. 02/06 14:40:53。    TCPIP 链接已成功启动
I. 02/06 14:40:53。立即接受请求

Server started successfully

 

  细心的读者可以观察到,demo数据库的启动比起utility_db多了事务日志和启动共享内存链接等步骤。

  服务启动以后,我们既可以用图形界面也可以用命令行工具连接IQ数据库,这里介绍命令行工具连接方法。

  (三)连接和访问数据库

  命令行的语法示例如下,其中uid是用户名,pwd是口令,eng是数据库名,就是上面介绍的iqdemo.cfg中-n所表示的部分,-nogui表示命令行方式,缺一不可。

dbisql -c "uid=dba;pwd=sql;eng=redflag11012601_iqdemo" –nogui

  我们连接上数据库,然后发出一条创建表的命令,执行成功,表明数据库连接正常。

[root@redflag11012601 ~]# . $SYBASE/IQ-15_2/IQ-15_2.sh
[root@redflag11012601 ~]# dbisql -c "uid=dba;pwd=sql;eng=redflag11012601_iqdemo" -nogui

(DBA)> create table t(a varchar(10));
执行时间: 0.021 秒

  如果您的系统采用中文字符,还需要增加charset=gb2312参数,确保命令和错误信息显示中文,否则有时会显示乱码。你可以把LANG环境变量设为C,那么所有提示都是英语。

dbisql -c "uid=dba;pwd=sql;eng=redflag11012601_iqdemo;charset=gb2312" -nogui

  请注意命令行工具有许多限制,但是经常使用SQL Plus的Oracle用户会感觉很类似。

  1.回车表示一行命令的结束,一行命令最多有512个字节。这对于一个稍为复杂的SQL来说都是不可能的任务,甚至一个列较多的表创建语句都是难以办到的。结果只好先把命令保存到脚本文件,通过read命令执行脚本来解决。

  2.SQL脚本文件中如果包含多个SQL语句,如果是多个DDL语句,则都会得到执行,如果是多个SELECT查询语句,则只有最后一个的结果能够显示,这样要批量执行多个查询就很不方便。

  Sybase IQ采用用户作为表的schema,这点与Oracle比较相似,默认用户就是连接时的DBA用户,可以用下述命令创建新用户并赋予相应权限,然后就可以用用户名.表名的方式引用表,不同用户下可以创建同名的表,这些表的物理存储是不同的。

(DBA)> create user ssb identified by ssb;
执行时间: 0.035 秒

(DBA)> grant connect,dba to ssb;
执行时间: 0.006 秒

(DBA)> create table ssb.test(a varchar(10));
执行时间: 0.04 秒

(DBA)> insert into ssb.test values('abc123');
已插入 1 行
执行时间: 0.014 秒

 

  三、SybaseIQ功能测试

  (一)数据库空间管理

  Sybase IQ的demo数据库不可以自动增长,在创建时限制了数据库的大小,只有200MB,用来做一般的小规模测试尚可,如果要做大数据量的测试就不够用了,而且Sybase的数据文件管理方式与Oracle类似,有数据库空间(相当于Oracle的表空间)和数据文件的概念,一个数据库空间可以包括一个或多个数据文件,每个数据文件可以指定不同的大小,数据文件的总大小就是数据库空间的大小,因此可以通过自动增长和增加文件两种方式扩充数据库。

  下面为我们的测试创建一个数据文件的初始大小为1000MB,保留空间为10000MB,实际总空间最多可以根据需要扩充为11000MB的数据库空间。然后我们将此数据库空间设定为默认数据库空间。sp_iqdbspace命令可用于查看当前数据库各个数据库空间使用的情况。

(DBA)> CREATE DBSPACE tpch_main USING FILE tpch_main '/user1/app/tpch_main.iq'SIZE 1000 RESERVE 10000;
Execution time: 4.505 seconds

(DBA)> set option PUBLIC.default_dbspace='tpch_main';
Execution time: 0.003 seconds

(DBA)> sp_iqdbspace
DBSpaceName     DBSpaceType Writable Online Usage TotalSize Reserve NumFiles
----------------------------------------------------------------------------
iq_main         MAIN        T        T      77    275M      0B      1        
IQ_SYSTEM_MAIN  MAIN        T        T      25    25M       200M    1        
IQ_SYSTEM_TEMP  TEMPORARY   T        T      6     12.5M     0B      1        
tpch_main       MAIN        T        T      1     1000M     9.76G   1        


DBSpaceName       NumRWFiles Stripingon StripeSize BlkTypes          OkToDrop
-----------------------------------------------------------------------------
iq_main           1          T          1K         1H,26898A         N      
IQ_SYSTEM_MAIN    1          T          1K         1H,608F,32D,128M  N      
IQ_SYSTEM_TEMP    1          T          1K         1H,64F,16A        N      
tpch_main         1          T          1K         1H                Y      
(4 rows)

Execution time: 0.028 seconds

  如果数据库空间的保留空间容量还未用完,但数据文件大小不足,那么数据库空间只有数据文件大小那么大,可以用下面命令增加文件大小来达到扩容的目的。

(DBA)> alter DBSPACE tpch_main ADD 2000 MB;
Execution time: 8.656 seconds

  下面命令为数据库空间增加一个32000MB的数据文件。数据库空间总大小也扩充相同容量。没有保留空间。

alter DBSPACE tpch_main add FILE tpch_main2 '/user1/app/tpch_main2.iq' size 32000;

  若数据库空间中包含不止一个数据文件,那么不能再用前面的命令直接增加空间大小,必须用下面的命令明确指定是对哪个文件的操作。

(DBA)> alter DBSPACE tpch_main alter FILE tpch_main size 11000;
执行时间: 5.006 秒

  数据库空间的操作还有其他一些,比如设置数据文件的条带化存储等,请查阅用户手册。

  (二)导出和导入

  批量导入采用load table命令,它的第一种语法是:

  Load TABLE 表名 ( 第一个列名 '列分隔符', 第二个列名 '列分隔符',… 最后一个列名 '列分隔符行分隔符') FROM 文件名 选项。

  其中 选项 的功能非常丰富,具体参数请看看手册。

  其中列分隔符可以包含多个字符。也可以用X+十六进制ascii码的方式表示。

  注意如果数据文件是Windows格式的文本文件(换行符是\r\n),最后一列的行分隔符需要用\X0D\X0A表示。比如下面的导入语句。

(DBA)> Load TABLE LINEITEM ( L_ORDERKEY '|',L_PARTKEY '|',L_SUPPKEY '|',L_LINENUMBER '|',L_QUANTITY '|',L_EXTENDEDPRICE '|',L_DISCOUNT '|',L_TAX '|',L_RETURNFLAG '|',L_LINESTATUS '|',L_SHIPDATE '|',L_COMMITDATE '|',L_RECEIPTDATE '|',L_SHIPINSTRUCT '|',L_SHIPMODE '|',L_COMMENT '\X7C\X0D\X0A')From '/user1/app/data/lineitem.tbl'ESCAPES OFF QUOTES OFF NOTIFY 1000000 WITH CHECKPOINT ON;
59986052 row(s) affected
Execution time: 202.032 seconds

 

  如果绝大部分列的分隔符都是同样的,load table命令可以采用更简洁一些的第二种写法:

  Load TABLE 表名 ( 第一个列名, 第二个列名,… 最后一个列名) FROM 文件名 选项ROW DELIMITED BY '\n' DELIMITED BY ','。

  这里将分隔符统一指定,如果某些列有特殊的分隔符,再单独指出即可。例如下面的导入命令表示最后一列分隔符是空格,其它分隔符都是默认的','。

(DBA)> Load table rk.hu(H0, ID, H02, H031, H032, H041, H042, H051, H052, H061, H062, H071, H072, H081, H082, H09, H10, H11, H12, H13, H14, H15 , H16, H17, H18, H19, H20, H21, H22, H23, HA0, HA1, HA2, HA3, HA4, HA5, HA6, HA7, HA8, HA9, HA10, HA11, HA20 ' ')From '/user1/daa'ESCAPES OFF QUOTES OFF NOTIFY 100000 WITH CHECKPOINT ON ROW DELIMITED BY '\n' ;

  批量数据导出的办法有2种,第一种采用输出重定向,语法是在查询语句后面加># 文件名,注意文件名不能用引号括起。

(DBA)> select * from t2 ># /user1/app/t2a.txt
id         v1          v2          
----------------------------------
1          2           3          
1          1           3          
2          1           4          
2          2           5          

(4 行)

执行时间: 0.022 秒
正在将数据导出到 "/user1/app/t2a.txt"
4 行已写入 "/user1/app/t2a.txt"

  我们看到屏幕输出的同时产生了输出文件,输出文件内容如下:

[root@redflag11012601 app]# cat  /user1/app/t2a.txt
'1',2,3
'1',1,3
'2',1,4
'2',2,5

  第二种称为数据提取选项,采用设置临时外部文件名和select语句配合的办法完成,举例如下:

(DBA)> SET TEMPORARY OPTION Temp_Extract_Name1 = '/user1/app/t2.txt';
执行时间: 0.002 秒

(DBA)> SET TEMPORARY OPTION Temp_Extract_Name2 = ''; -- 表示不导出多个文件
执行时间: 0.001 秒

(DBA)> SELECT * from t2;
id         v1          v2          
----------------------------------

(0 行)

执行时间: 0.027 秒

(DBA)> SET TEMPORARY OPTION Temp_Extract_Name1 = ''; -- 导出完成后重置临时外部文件为空
执行时间: 0.002 秒

[root@redflag11012601 app]# cat  /user1/app/t2.txt
1,2,3,
1,1,3,
2,1,4,
2,2,5,

  我们看到屏幕输出为0行,而在操作系统上产生了导出文本文件,导出的字符类型列默认没有单引号分隔符,而最后一列后面带有列分隔符。对于大型结果集,SybaseIQ建议采用数据提取来提高输出速度,数据提取的其它详细设置内容请参考用户手册。

  (三)SQL语句的功能特点

  Sybase IQ支持分区和索引、主键、外键等,还支持不同分区使用不同的数据库空间。支持分析函数和group by的rollup、cube扩展。这在我们见过的列存储数据库中是对SQL标准支持最完备的,为数据分析应用打下了良好的基础。这里分别举例说明。

  1. 创建分区表,不同分区指定不同的数据库空间。

(DBA)> create table tp2(id varchar(10))partition by range(id)(p11 values <=('12') in iq_main,p12 values <=('13') in iq_main,pmax values <=(max)in tpch_main);

  我们插入一些id小于'12'的数据,可以观察到数据库空间iq_main的使用率上升。

DBA)> sp_iqdbspace ('IQ_MAIN')
DBSpaceName Usage TotalSize Reserve NumFiles    NumRWFiles  Stripingon StripeSize  
----------------------------------------------------------------------------------
iq_main     77    275M      0B      1           1           T          1K        

(DBA)> insert into tp2(id) select  substr(id,1,10) from rk.hu1 where id
<='12';
已插入 4417045 行
执行时间: 3.301 秒

(DBA)
> commit;
执行时间: 0.013 秒

(DBA)> sp_iqdbspace ('IQ_MAIN')
DBSpaceName Usage TotalSize Reserve NumFiles    NumRWFiles  Stripingon StripeSize  
----------------------------------------------------------------------------------
iq_main     80    275M      0B      1           1           T          1K        

  而其他的数据库空间没有变化。

  2. 给表增加主键和一个组合列索引。

  SybaseIQ默认创建表时就为各个列单独创建了索引。而且还支持用户增加额外的索引和主键约束等,以满足各种查询和数据唯一性需求。

(DBA)> create table t2(id varchar(10),v1 int,v2 int);
执行时间: 0.132 秒

(DBA)> alter table t2 add primary key(id,v1); -- 增加主键必须首先增加非空约束
无法执行语句。
  表 't2' 中的列 'id' 不能为 NULL
  SQLCODE=-195,ODBC 3 状态="23000"
  第 1 行,第 1 列
  alter table t2 add primary key(id,v1)
按 ENTER 键可继续...

(DBA)> alter table t2 modify id not null;
执行时间: 0.065 秒

(DBA)> alter table t2 modify v1 not null;
执行时间: 0.044 秒

(DBA)> alter table t2 add primary key(id,v1);
执行时间: 0.015 秒

(DBA)> create index idxt2 on t2(id,v2);
执行时间: 0.013 秒

(DBA)> insert into t2 values(1,2,3); -- 整数类型无法自动转换成varchar
无法执行语句。
  无法隐式将列 'id' 从数据类型(integer)转换为数据类型(varchar)。
  -- (db_loadengine_cvt.cxx
  5727)
  SQLCODE=-1000187,ODBC 3 状态="HY000"
  第 1 行,第 1 列
  insert into t2 values(1,2,3)
按 ENTER 键可继续...

(DBA)> insert into t2 values('1',2,3);
已插入 1 行
执行时间: 0.022 秒

(DBA)> insert into t2 values('1',1,3);
已插入 1 行
执行时间: 0.004 秒

(DBA)> insert into t2 values('1',1,4); -- 违反主键约束的数据无法插入
无法执行语句。
  尝试将重复值插入行 3 的唯一索引 DBA.t2.ASIQ_IDX_T775_I4_HG 中。
  -- (db_sqlins.cxx
  14694)
  SQLCODE=-1002003,ODBC 3 状态="HY000"
  第 1 行,第 1 列
  insert into t2 values('1',1,4)
按 ENTER 键可继续...

(DBA)> insert into t2 values('2',1,4);
已插入 1 行
执行时间: 0.004 秒

  我们可以用存储过程查看表的各列索引的名称和空间大小。

(DBA)> sp_iqindexinfo 'table t2';
Object                     DbspaceName ObjSize DBSpPct MinBlk    MaxBlk
--------------------------------------------------------------------------
DBA.t2                     tpch_main   200K    1       3370883   15957433
DBA.t2.ASIQ_IDX_T775_C1_FP tpch_main   288K    1       3370954   15186901
DBA.t2.ASIQ_IDX_T775_C2_FP tpch_main   288K    1       3370970   15957449
DBA.t2.ASIQ_IDX_T775_C3_FP tpch_main   288K    1       8277762   15957465
DBA.t2.ASIQ_IDX_T775_I4_HG tpch_main   152K    1       3371005   15957481
DBA.t2.idxt2               tpch_main   304K    1       3370986   8277877

  可以看到,t2表既有默认的单列索引,又有用户添加的主键索引ASIQ_IDX_T775_I4_HG和自定义索引idxt2。

  从上面的操作可以看出,SybaseIQ增加的对主键的支持和严格的数据合法性检查对于保证数据正确性很有意义,而减轻了程序员的额外编程负担。一般数值和字符不能隐式自动转换,如果数据加载时错误也报错。

  3. 利用分析函数排名

(DBA)> insert into t2 values('2',2,5);
已插入 1 行
执行时间: 0.006 秒

(DBA)> commit;
执行时间: 0.016 秒

(DBA)> select id,v1,v2,rank()over(order by v2 )from t2;
id         v1          v2          rank() over(order by t2.v2 asc)
------------------------------------------------------------------
1          2           3           1                              
1          1           3           1                              
2          1           4           3                              
2          2           5           4                              

(4 行)

执行时间: 0.018 秒

(DBA)> select id,v1,v2,dense_rank()over(order by v2 )from t2;
id         v1          v2          dense_rank() over(order by t2.v2 asc)
------------------------------------------------------------------------
1          2           3           1                                    
1          1           3           1                                    
2          1           4           2                                    
2          2           5           3                                    

(4 行)

执行时间: 0.017 秒

  Rank函数可以方便地对数据进行排名,如果需要名次连续,改用dense_rank函数。

  4. 利用CUBE子句求出多列组合汇总结果

(DBA)> select h0,h02,count(*)cnt from rk.hu group by h0,h02;
h0 h02 cnt                  
---------------------------
1      1                    
0  1   306826326            
1  2   851846              
0  2   9890655              
1  1   33664871            

(5 行)

执行时间: 16.644 秒

(DBA)> select h0,h02,count(*)cnt from rk.hu group by cube(h0,h02);
h0 h02 cnt                  
---------------------------
0  1   306826326            
0  2   9890655              
0  (NU 316716981            
1      1                    
1  1   33664871            
1  2   851846              
1  (NU 34516718            
(N (NU 351233699            
(N 1   340491197            
(N 2   10742501            
(N     1                    

(11 行)
注意: 为进行显示,某些数据值已被截断。

执行时间: 145.805 秒

(DBA)> select h0,h02,sum(cnt)cnt from(select h0,h02,count(*)cnt from rk.hu group by h0,h02)a group by cube(h0,h02); -- 与上面语句逻辑上等价的通过对子查询再汇总
h0 h02 cnt                                  
--------------------------------------------
0  1   306826326                            
0  2   9890655                              
0  (NU 316716981                            
1      1                                    
1  1   33664871                              
1  2   851846                                
1  (NU 34516718                              
(N (NU 351233699                            
(N 1   340491197                            
(N 2   10742501                              
(N     1                                    

(11 行)
注意: 为进行显示,某些数据值已被截断。

执行时间: 13.375 秒

  我们可看到,group by cube查询语法给多列组合的分类汇总带来了便利,但直接对原始大量数据进行汇总的效率较差,有某项功能和功能有实用价值是两个不同的概念,而且cube不支持distinct操作,实用性有待提高。Rollup查询与cube类似,不再举例。

  5. NULL和空字符串的不同

  从上面的例子我们看到Sybase IQ把字符类型列的NULL和空字符串是当作不同的内容处理的。这点和Oracle等数据库不同,需要引起注意。

  此外,Sybase IQ还支持With子查询,当子查询被多次引用时可以简化sql语句,例如:

(DBA)> with t as(select 1 a union all select 2)select * from t,t b;
a      a      
-------------
1      1      
1      2      
2      1      
2      2      

(4 行)

 

  四、性能测试

  测试项目包含三方面,第一是加载,数据仓库要处理的数据量巨大,数据加载能力是选择数据库软件要考虑的重要因素之一,我们将测试包括外部文本数据加载和从数据库内部抽取部分数据到其他表的性能。第二是压缩,数据压缩时常被作为列式数据库的一个卖点来宣传,因此我们单独把它拿出来测试。由于多数数据库没有单独的表压缩命令,都是依靠参数指定是否压缩或根本无法指定不压缩(Sybase IQ),只测试压缩后的占用空间对原始外部文件的压缩率。第三是测试重点,数据查询,主要采用tpc-h scala=10,TPC-H是一个业界公认的数据仓库性能测试基准,比较公正和中立,它定义了8个标准数据库表:customer,lineitem,nation,orders,partsupp,part,region,supplier,各表之间的关系见tpc.org网站的官方文档,一个数据生成工具(dbgen)和一个查询生成工具(qgen)。此外TPC-H定义了不同的数据仓库容量(size),包括:1GB、100GB、300GB、1000GB等。dbgen工具可以通过传递不同的参数值,生成不同数据库尺寸下的表数据,非常灵活。 Qgen可以随机产生相同条件的不同取值的查询,我们这里为了简化,只取一次产生的查询语句。其标准语句也可以从www.tpc.org的测试结果中获得,为了公正起见,采用TPC组织在2010年12月15日在IBM Power 780平台中的测试语句,下载地址:http://www.tpc.org/results/FDR/tpch/TPC-H_1TB_IBM780_Sybase-SupportingFilesArchive.zip

  (一) 数据加载

  1. 从外部文本文件导入

  首先对TPC-H的原始文件进行编译,然后执行如下语句,生成测试数据集:

# for LINEITEM
../tpch/dbgen -s 10 -C 4 -S 1 -T L -f -b dists.dss
../tpch/dbgen -s 10 -C 4 -S 2 -T L -f -b dists.dss
../tpch/dbgen -s 10 -C 4 -S 3 -T L -f -b dists.dss
../tpch/dbgen -s 10 -C 4 -S 4 -T L -f -b dists.dss

# for ORDERS
../tpch/dbgen -s 10 -T O -f -b dists.dss

# for PART
../tpch/dbgen -s 10 -T P -f -b dists.dss  

# for PARTSUPP
../tpch/dbgen -s 10 -T S -f -b dists.dss

# for SUPPLIER
../tpch/dbgen -s 10 -T s -f -b dists.dss

# for CUSTOMER
../tpch/dbgen -s 10 -T c -f -b dists.dss

# for NATION
../tpch/dbgen -T n -f -b dists.dss

# for REGION
../tpch/dbgen -T r -f -b dists.dss

  我们装载数据测试结果如下:

load part execute time is : 6448ms, load data : 2000000 row(s) affected
load supplier execute time is : 980ms, load data : 100000 row(s) affected
load partsupp execute time is : 25305ms, load data : 8000000 row(s) affected
load customer execute time is : 6769ms, load data : 1500000 row(s) affected
load orders execute time is : 56055ms, load data : 15000000 row(s) affected
load lineitem execute time is : 175609ms, load data : 59986052 row(s) affected
load NATION execute time is : 0ms, load data : 5 row(s) affected
load REGION execute time is : 0ms, load data : 25 row(s) affected
[Execution time: 271.953 seconds]

  从结果来看,对于记录数最大、表最宽的lineitem,装载速度大约34万多行/秒!由此可以看到IQ的简单、较高的压缩能力、较高的性能等特点!另外,带索引快速加载也是IQ的特色,相对于行式数据库,可以更快速的完成加载。

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

  数据库从库内转移数据的方法有多种,SybaseIQ支持insert into 表1 select * from 表2这种方式。

  SybaseIQ的命令行:

CREATE TABLE RK.HU1 (H0 VARCHAR(1), ID VARCHAR(18), H02 VARCHAR(1), H031 VARCHAR(2), H032 VARCHAR(2), H041 VARCHAR(2), H042 VARCHAR(2), H051 VARCHAR(2), H052 VARCHAR(2), H061 VARCHAR(2), H062 VARCHAR(2), H071 VARCHAR(1), H072 VARCHAR(1), H081 VARCHAR(1), H082 VARCHAR(1), H09 VARCHAR(2), H10 VARCHAR(3), H11 VARCHAR(1), H12 VARCHAR(1), H13 VARCHAR(4), H14 VARCHAR(1), H15 VARCHAR(1), H16 VARCHAR(1), H17 VARCHAR(1), H18 VARCHAR(1), H19 VARCHAR(1), H20 VARCHAR(1), H21 VARCHAR(1), H22 VARCHAR(1), H23 VARCHAR(1), HA0 VARCHAR(1), HA1 VARCHAR(2), HA2 VARCHAR(2), HA3 VARCHAR(1), HA4 VARCHAR(1), HA5 VARCHAR(1), HA6 VARCHAR(1), HA7 VARCHAR(1), HA8 VARCHAR(1), HA9 VARCHAR(1), HA10 VARCHAR(3), HA11 VARCHAR(1), HA20 VARCHAR(2))
partition by range(id)
(
p11 values
<=('12'),
p12 values <
=('13'),
p13 values <=('14'),
p14 values <=('15'),
p15 values <=('16')
);
(DBA)
> read /user1/app/sybase_part.txt
执行时间: 0.449 秒

(DBA)> insert into rk.hu1 select * from rk.hu where id
<'2';
已插入 41533005 行
执行时间: 377.465 秒

(DBA)
> commit;
执行时间: 0.011 秒

 

  (二) 数据压缩

  Sybase IQ采用sp_iqtablesize('用户名.表名')查看各个表占用的空间大小,也可采用sp_iqdbspaceinfo查看表开销(数据、索引、约束等)的明细。

(DBA)> sp_iqtablesize('DBA.CUSTOMER')          
Ownername  Tablename   Columns KBytes Pages CompressedPages NBlocks
-------------------------------------------------------------------
DBA        CUSTOMER    8       158408 2622  2605            19801  

  Sp_iqdbaspsceinfo的结果如下:

object_name  columns  indexes  metadata  primary_key
-------------------------------------------------------------------
Customer     145M     3.57M    15.2M     15.8M
Lineitem     2.46G    2.14G    22.6M     0B
nation       96K      48K      2.19M     24K
orders       675M     213M     10.8M     170M
part         80.3M    0B       12.1M     21.5M
partsupp     550M     107M     12.5M     122M
region       72K      0B       1.53M     24K
supplier     1.92M    824K     15M       1.09M

  我们将原始csv文件的大小除以IQ数据库的数据大小,得到的倍数作为它们的压缩率,得到下面的结果:

  原始数据大小/数据库大小=1.63 (加索引、约束开销)

  原始数据大小/数据库大小=2.77 (不加索引开销,纯数据)

  (三) 数据查询

  Sybase的缓存大小对性能影响很大,有时甚至对功能也有影响,对数据仓库应用而言,demo数据库的原始配置实在是太低了。由于我们的系统内存充足,我们把最后2个缓冲区大小增加后用新参数文件重新启动数据库,大部分tpch查询速度提高了3到5倍。下面各个测试项目列出的均是采用新参数文件的结果。

[root@redflag11012601 demo]# cat iqdemo.cfg.bad
# iqdemo.cfg
# ------------------------------------------------------------
# Default startup parameters for the ASIQ demo database
# ------------------------------------------------------------

-n  redflag11012601_iqdemo
-x  tcpip{port=2638}

# The following parameters are also found in the configuration file
# /opt/sybase/IQ-15_2/scripts/default.cfg.  Any parameters not specified below
# and not in the start up parameter list, will be added by start_iq
# using default.cfg as a guide.

-c  48m
-gc 20
-gd all
-gl all
-gm 10
-gp 4096

-iqmc 12880
-iqtc 10240

[root@redflag11012601 demo]# start_iq @iqdemo.cfg.bad iqdemo.db

  1. tpch查询测试

  我们将从tpch.org网站下载的源代码编译后,采用dbgen -s10生成一套10GB规模的数据,用qgen产生查询SQL语句,只针对IQ数据库作语法修改,尽量不改变语句的结构。

  测出的结果见原始tpch查询时间表。


  我们看到,SybaseIQ在这方面表现不错,基本上所有的原始脚本都能执行,而且基本没有执行特别慢的语句,所有查询都能在10秒以内完成。稍感意外的是,Sybase不支持SQL标准支持的date''、interval''和extract from用法,只好改用date()、year()等函数。而用于限定结果集行数的top语句同limit或rownum的一个明显区别是要求结果集已经排序,否则虽然也能输出结果,但输出错误提示消息。

  2.SSB查询测试

  有读者反映我的上一系列文章的测试不全面,遗漏了SSB测试,这次专门补充写上,以下是时间对比表。


  由于SSB的数据量实际比tpc-h少,并且查询语句也较简单。所有查询都能在10秒以内完成。

  五、小结

  由于用户的实际需求千差万别,因此很难简单地划分那类查询属于数据仓库方面而哪些查询不是。比如,tpc-h查询中2个大表的exists和not exists条件未必不常用。tpc-h由一个独立的tpc组织来维护,得到大多数软硬件厂商的支持,Ssb是一个大学研究的成果,scala=10的查询,都是几秒钟完成一个查询,不足以作为评估数据库的主要数据集的选择。而用户真实的数据查询中,不限定条件的全表分组汇总也很常见。好的数据库管理系统应该能够最大限度地适应用户不同类型的查询语句,并针对不同查询都尽量给出较好的执行计划,当然要做到这点很难。SybaseIQ作为新兴的列式数据库的一员,在3个测试中的总体表现都还不错。

  Sybase IQ支持大多数的SQL标准写法和分析函数,一般数值和字符不能隐式自动转换,要显式用cast函数等转换,程序员还需要注意日期类型的特殊性,但这种努力往往也能带来乐趣。它还在默认索引之外支持用户自定义索引和主键,给用户查询带来了方便。

  Infobright的短板主要落在tpc-h查询的4\17\20\21等几个,这类查询的特点是表间关联条件比较复杂,人工优化的效果更加明显。

  SybaseIQ的数据加载工具能较好地利用多个CPU,性能还不错,但对整数类型列,文本导入的性能稍差一些,,支持管道和Linux下很多实用的文字处理命令工具,比如tr,awk可以弥补某些ETL功能的不足,能解决比如文件的最后一个列的分隔符问题等。但最好能在数据库本身的功能中增加这些选项,以便更多的平台都可以使用。Sybase IQ的文件数据合法性检查更严格,但无法提示出错的各行,最好采取类似Oracle的sql*loader的bad文件的方式,这样有利于提高插入效率

  Sybase IQ的压缩率一般在2到5倍左右。当存储数据仓库的大量数据时,能有效地减少数据的存储空间,提供更多的空间供用户使用。

  由于本人接触SybaseIQ数据库的时间不长,一些性能优化的方法还未掌握,文章中的不足和错误之处,欢迎读者们讨论和指正。

0