技术开发 频道

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

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

0