微淘可以发笑话么:sql语句的效率问题

来源:百度文库 编辑:神马品牌网 时间:2024/05/12 18:52:29
select count(*) from t1
where b in ('1','2','3','4','5','6')
and a > '11111'
and a < '99999'

t1是oraclek中的一个表,里面有五百多万条数据, a和b是t1中的字段,对于上面这条查询语句如何提高效率?(已有唯一索引,但是索引的字段不是A也不是B,而是T1里的另外一个字段,不增加其它索引)
只改变SQL语句不改变其它的.

我以前用Sybase的,oracle语法可能和sybase有所出入,就不直接给你修改了,下面我提6点建议:
1、b in ('1','2','3','4','5','6')
如果b的类型是整型,这句话应修改成 b between ('1','6')
2、a > '11111' and a < '99999'
应修改成a between ('11111','99999')
between 这个词在oracle里面应该也有对应的语句,请确认。
3、凡是做count(*)运算的,速度都很慢,尤其是有着500万数据的大表,如果你不是仅仅查询一次的话,强烈建议根据查询条件建索引,不一定要唯一性索引。
4、建索引的字段作为查询条件时一定要排在where后面的第一位
5、增加行锁的数量。
6、还有一个办法就是把b、a从t1表里抽出来单独建一个临时表,(select b,a from t1 into #ttt)然后对ttt表的a字段建索引,再进行查询,这个方法最通用,因为你做统计的时候不会引起t1表大面积加锁从而影响别的用户的使用。
需要注意的是这个临时表最好建成动态的,即语句执行完毕后就自行释放,这样不会在数据库中生成垃圾表,影响日后的清理和维护。