我有一张极其庞大的表, 里面有个时间的字段 atime,我如果要取某天的,如: 
select *  from  table_name 
where to_char(atime,'yyyymmdd')='20110402' 太慢了,运行了十多分钟都没有出来,请问有没有其他的方法更快的?

解决方案 »

  1.   

    尽量不要在字段上作计算,而是在常量上计算,因为字段上的计算在每一条记录上都要执行一次,也就是执行了极大庞大的规模,而等式右边的计算只是在数据库编译这个 SQL 语句时计算过一次。select *  from  table_name 
    where atime >= date('20110402') and atime <date('20110403');
      

  2.   

    select *  from  table_name 
    where to_char(atime,'yyyymmdd')='20110402' 
    这种情况下,由于to_char(atime,'yyyymmdd')对列进行了转换,用不到索引了。
    一般情况下,都是在后面进行转换
    select *  from  table_name 
    where atime >= date('20110402','yyyy-mm-dd') and atime <date('20110403','yyyy-mm-dd');

      

  3.   


    提示 missing expression 啊,少了参数吧。
      

  4.   

    select * from table_name 
    where atime>= timestamp('20110402000000') and atime<timestamp('20110403000000');
      

  5.   

    菜鸟路过学习ing~~to_char是可以用的。不过对于大量数据来说,实在是意见让人郁闷的事情如果你的时间使用字符串保存,那么你使用这个作为索引,问题就不存在了,而且也省却了co_char的转换,多好啊~
      

  6.   

    搞错了,写的是 DB2 的,换成 oracle 的写法。select * from table_name  
    where atime>= to_timestamp('20110402','yyyyMMdd') and atime< to_timestamp('20110403','yyyyMMdd');
      

  7.   


    select * from table_name   
    where atime>= to_char('20110402','yyyyMMdd') and atime< to_char('20110403','yyyyMMdd');
      

  8.   

    查询记录尽量不要用到'*',而是明确哪些列select * from table_name  
    where atime =  to_date('20110402','yyyymmdd')
      

  9.   

    除了上面的写法也可以试试trunc(atime,'DD')=to_date('20110402','yyyymmdd')
      

  10.   


    trunc(atime,'DD')这样是用不到索引的select * from table_name   
    where atime>= to_char('20110402','yyyyMMdd') and atime< to_char('20110403','yyyyMMdd');
      

  11.   

    首先你应该写清楚,你的字段atime的数据类型到底是:DATE / TIMESTAMP / TIMESTAMP WITH TIME ZONE或其它类型,这样,并写清楚,表中该列数据保存的精度。这样,别人,才好告诉你,该怎么选用函数。
      

  12.   

    --楼主,请看:http://topic.csdn.net/u/20110323/13/43a9766c-9a40-470d-8adb-9c2594282203.html
      

  13.   

    -- 在我的SQL语句中,我的原则是:
    -- *(01) 尽量避免隐式类型转换
    --      (例如:如果字段是日期类型的,我会在where语句等式左边用字段原型,而尽量在等式右边用函数,
                   绝不会在左边用函数转换成字符再去与右边比较);
    -- *(02) 尽量少用函数,同样一件事情,能够用两个函数就能解决的,我绝不会嵌套三个函数;
    --      (例如:求上个月的最后一天,我会用trunc(sysdate,'mm')-1,而不用last_day(add_months(sysdate,-1)) )
    -- *(03) 在所有的存储过程中,我会尽量用绑定变量,以避免硬解析带来的资源消耗!
    -- *(04) 在所有的存储过程中,能够用SQL语句的,我绝不会用循环去实现!
    --      (例如:列出上个月的每一天,我会用connect by去递归查询一下,绝不会去用循环从上个月第一天到最后一天)
    -- *(05) 当有一批处理的插入或更新时,我会用批量插入或批量更新,绝不会一条条记录的去更新!
      

  14.   

    谢谢各位,前面几个朋友说的,我试了下,感觉比用to_char快点,但是仍然不能满足我们这领导的要求,后面朋友的方法稍后再试试。
      

  15.   

    不好意思,我的字段数据类型是DATE 
      

  16.   

    如果你当前会话中的查询比较固定的话,可以:
    alter session set nls_date_format='YYYY-MM-DD';
    然后直接用:
    select * from table_name where atime='20110402'
      

  17.   

    atime有索引吗 没有都是白忙活