SELECT DISTINCT SYOHINCD,SYOMEIKJ,SUB_SYOMEIKJ,CYOSYAKJ,SYUPNKJ,HONTAI FROM WODR_MST_SYOHIN  WHERE 0 = 0 AND to_char(HATUBAIBI,'yyyy-mm')='2008-01' 我现在的数据库,有100万左右的数据!根据输入的,年和月想模糊查询出来相应的项目!
以上,使我现在的代码,可以实现!但是速度,是个大问题!
高人指点!可否有其他办法!数据库类型,为date,         oracle10g

解决方案 »

  1.   

    to_char(HATUBAIBI,'yyyy-mm')='2008-01'  
    把这个换成HATUBAIBI = to_date(.....)
    并且,对HATUBAIBI建立索引要知道OCI_DATE类型,在Oracle的内存里头才占7个字节。索引后的效率是非常高的。
      

  2.   

    最快的方法是按月建分区表,不知道你是什么类型的数据库,oltp?olap?
      

  3.   

    主可以换算一下:
    2008-01, 也就是2008-01-01 至 2008-01-31 23:59:59你写成:
    HATUBAIBI between to_date('2008-01-01', 'yyyy-mm-dd') and to_date('2008-01-31 23:59:59')就OK了
      

  4.   

    HATUBAIBI 这个字段加个索引,如果你搜索出的记录不多的话,是可以用上索引的
      

  5.   

    我现在是建立了,index,然后作了sql.append(" AND CONTAINS(HATUBAIBI,'" + getData("HATUBAIBI") +"-"+ getData("HATUBAIBIM")+"') > 0");
    使用了contains函数,速度似乎快了一点,也许是极限了!
      

  6.   

    不对。CONTAINS(HATUBAIBI,...), 你这样写,HATUBAIBI字段在左边进行了运算,是用不上索引的建了索引,在9i中还要分析它的, 比如:
    analyze table .. compute statistics 用这种方式:
    HATUBAIBI between to_date('2008-01-01', 'yyyy-mm-dd') and to_date('2008-01-31 23:59:59')
    才可以用上索引
      

  7.   

    可是我其他的编号,名字都用的这样的方法!难道也不可以吗?还是因为日期的特殊?
    我这里输入只有起始的年月,如何查询?没有and后面的日期,不过我可以自己计算
      

  8.   

    >可是我其他的编号,名字都用的这样的方法不管什么字段,型如:where func(filed_a)=value_a 这种写法,都是用不上索引的,除非你创建了func(field_a)这样的一个函数索引>没有and后面的日期
    那就是用大于(>)来比较洛