技术开发 频道

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

  如果绝大部分列的分隔符都是同样的,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        

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

0