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 秒
执行时间: 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
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 秒
已插入 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函数。