在oracle数据库中执行 select count(*)  from J2210000JB2005XBM  where  substr(C_XIAN,1,4) = '2101'语句 速度非常慢 要17秒  表的数据有100万 请问是怎么回事 该如何优化

解决方案 »

  1.   


    让查询走索引..
    substr(C_XIAN,1,4) = '2101' 这种写法会限制索引.. 能否通过其他字段来判断?Oracle 索引 详解
    http://blog.csdn.net/tianlesoftware/archive/2010/03/04/5347098.aspx
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716
      

  2.   

    select count(索引字段) from J2210000JB2005XBM where substr(C_XIAN,1,4) = '2101'
    试试,会提升速度?
      

  3.   

    不论是substr()  instr()  还是 like 都是一样的问题 ,一样的慢,
    select count(索引字段) 已经试过了  没用的 select 在执行查询数据的时候是很快的1、2秒就出来了,但是就是在count的时候会非常的慢期待高手 
      

  4.   


    你查询当然了,一般默认是first_rows,返回一部分数据,当然快了,count()的时候要走全表扫描.建立函数索引试试
      

  5.   

    既然你说selec 的时候快 ,那你试试这样会回好些。
    select count(0) from (select * from J2210000JB2005XBM where substr(C_XIAN,1,4) = '2101')
      

  6.   

    或者直接见个索引:create index idx on J2210000JB2005XBM substr(C_XIAN,1,4);
      

  7.   

    谢谢你的回答  在建立函数索引后 速度提高了 现在 还有个问题  如果我的count语句 是这样的 应该如何创建函数索引 
    select count(*)  from J2210000JB2005XBM  where  substr(C_XIAN,1,4) = '2101'  and  C_YSSZ='121'
      

  8.   

    一样的,创建substr(C_XIAN,1,4)索引,和C_YSSZ索引就可以了
      

  9.   

    select count(*) from J2210000JB2005XBM where C_XIAN LIKE '2101%'