技术开发 频道

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

  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 行)

 

0