如何提高sybase iq下group by 操作的效率?

[复制链接]
查看11 | 回复4 | 2009-7-22 09:30:00 | 显示全部楼层 |阅读模式
在sybase iq数据库上对一个表进行 group by 操作时,用count(1) 很长时间才能出结果,但用count(*) 操作很快就得到了结果,为什么?
那位高手说明一下原因。 说一下sybase iq 处理以下3条sql的效率区别,及原因,谢谢

select col1,count(1) from tab1
group by col1
select col1,count(*) from tab1
group by col1
select col1,count(col2) from tab1
group by col1
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
呵呵,你的问题比较长。
一般来言,count(*)是最快的操作,因为这个操作需要的信息已经记录在一些索引中,比如优化的FP、LF、HG中。那么如果col2中有合适的索引,SQL3的性能应该核count(*) 相差不多。注意,优化器对count(1)没有进行优化,系统不能直接从索引获取需要的信息。
Sybase IQ 的Group by常用的有三种算法, vertical、hash 和sort group算法,一般来言,让优化器自己选择合适的算法,用户只需要创建合适的索引。可以参考query plan中的advise来创建必要的索引。
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
嗯,很有帮助,以前搞oracle,执行计划很清晰。现在iq中的执行计划看不太懂。
而且oracle中系统优化器自己选择的算法不一定是最优的,特别是在并行设置的数据中,数据库经常地不用索引,采用并行模式处理某些问题(选择某个算法跟设置的某些数据库参数还有关系)。
不知道在iq中是否存在这种系统选择最优,但实际并不是最优的问题。
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
IQ optimizer算法的选择依赖于对metadata的正确估算。如果不能获取准确的信息,通常选择最安全的算法,也就会导致算法的不合适。可以通过创建合适的索引供优化器正确估算,从而选用正确的算法。
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
又有个棘手的问题。
3个表关联取值,索引怎么建提高效率?3个表的数据量都约在4000万左右。普通服务器,做了2个多小时(没建索引)。
在trandate上建索引,Join操作就用不了索引,在col1或col2上建索引,数据量太多,不知道结果如何。
若将join 改成函数操作,效率怎么样?
select a.*, c.cusno from tab1 a, tab2 b, tab3 c
where
a.col1=b.col1 and b.col2=c.col2
and a.trandate='2009-03-31'
and b.trandate='2009-03-31'
and c.trandate='2009-03-31'
在tab2的col1,tab3的col2上建低聚基索引,
函数写成:
func(in_col)
select col2 into var_str from tab2 where col1=in_col;
select custno into var_custno from tab3 where col2=var_str;
return var_custno
调用:
select a.*, func(col1) as custnofrom tab1 a where
trandate ='2009-03-31'

感谢回帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行