我这有个语句,数据少的时候还可以,一多要卡半天。希望高手能帮我优化一下。select * from (select  rownum  rn ,t.* from view_m_queue t )a 
where a.rn >'0'and  booking>= '2005-6-2 0:00:00'and 
booking<= '2010-6-18 0:00:00'and rownum<='5'
and QueuenameID='12'and Queuestate='0'order by queueId希望高手告诉我下为什么这样写数据多了会慢?

解决方案 »

  1.   

    a.rn >'0' 应该是a.rn >0
      

  2.   

    当然有区别,你这样写的话.oracle 要自己进行转换,大量转换的还是占用时间的 ,建议类型明确..减少各种开销..and rownum<='5' 为什么又冒出来个ROWNUM?'
    写错???兄弟你的SQL语句有点乱...
      

  3.   

     order by queueId此字段有无索引,如果没有的话,会很慢的.
      

  4.   

    告诉下怎么写一次搞定,谢谢。这条语句其实是用于网站的分页,每页显示5条,所要我要把用ROWNUM生成一个有序的字段,这样每次搜5条。不知道高手们有什么好办法。因为表里面没一个有序的字段可用于每次搜5行实现分页
      

  5.   

    select * from (select  rownum  rn ,t.* from view_m_queue t )a 
    where a.rn <=5 and  booking>= '2005-6-2 0:00:00'and 
    booking<= '2010-6-18 0:00:00'
    and QueuenameID='12'and Queuestate='0'order by queueId
    我整理后的语句
      

  6.   

    select * from (select rownum rn ,t.* from view_m_queue t )a  
    where a.rn >'0'and booking>= '2005-6-2 0:00:00'and  
    booking<= '2010-6-18 0:00:00'and rownum<='5'
    and QueuenameID='12'and Queuestate='0'order by queueId
    第一:a.rn是数值型的吧?
    第二:rownum<'5'这是要干什么?
    第三:'0'order by queueId是否必要?
    下边我只能把优化sql语句的方法简单的描述一下:
    一:oracle在解析的时候是将所有的小写字母转换成大写字母
    二:在解析的时候oracle是从where语句的从后向前解析所有,要把能够最大限度的去除多余记录的条件放到最后,向前一次增加。
    三:如必要可以见索引来提高查询效率
    四:如果不必要不要用order by,distinct,group by 这样的语句,太消耗资源,会全表扫面表。
    五:优化表的结构,oracle中处理最快的数据类型时数值类型和字符类型,如果可以用char替换varchar2类型的字段,因为char类型比varchar2速度快,但是占得空间要大于varchar2。
      

  7.   

    楼主看不懂你的sql为啥这么写,建议你把需求描述下,大家好帮主你改sql
    你的sql很奇怪。。尤其是那rownum
      

  8.   

    对第二点有不同意见,以下两个SQL语句的执行计划相同,只是where条件的顺不同:select E.LAST_NAME,E.SALARY,D.DEPARTMENT_NAME
    from employees e, departments d
    where 
    E.EMPLOYEE_ID = 100
    and E.DEPARTMENT_ID = D.DEPARTMENT_ID;select E.LAST_NAME,E.SALARY,D.DEPARTMENT_NAME
    from employees e, departments d
    where 
    E.DEPARTMENT_ID = D.DEPARTMENT_ID
    and 
    E.EMPLOYEE_ID = 100;
      

  9.   

    先order by 再rownum,否则顺序得不到保证