select (select dmmc from dwdmb where dmdma.dwdm)) as dmmc,rq,name from lista 
where rq = (select max(rq) from lista where name='wz') and name='wz'我算了一下,大概执行一遍需要15~32毫秒之间,关键是我要执行100~400遍,不停的更换name变量有没有好的方法优化下查询速度

解决方案 »

  1.   

    用绑定变量,并且NAME上加索引
      

  2.   

    索引: list(name, rq, dwdm) (也可以按照楼上说的)
    select b.dmmc, a.rq, a.name from
    ( select rq, name, dwdm from list where dwdm='wz' order by rq desc
    ) a, dwdm b where a.dwdm=b.dmdm(+) and rownum=1; --建议用表关联,否则执行顺序会乱
      

  3.   


    (select dmmc from dwdmb where dmdma.dwdm) 这个是什么,是否可以忽略不计?where条件重复了,既然是name为wz的max(rq),后面的那个name='wz' 是多余的.索引: list(name, rq)即可.如果表数据量很大几百上千万,可以取rowid,分步骤实现,也不怎么慢的.
    select * from (select dmmc,rq,name from lista where name='wz' order by name,rq) where rownum=1;
      

  4.   

    小结一下:
    1.同意:用绑定变量,并且NAME上加索引
    2.SQL可以通过如下优化:
    Select *
      From (Select Dmmc
                  ,Rq
                  ,Name
                  ,Row_Number() Over(Partition By Name Order By Rq Desc) Rn
              From Lista
             Where Name = :Xxx)
     Where Rn = 1;
      

  5.   


    关键是我要执行100~400遍?是一个应用需要执行这个sql这么多次么,可以使用绑定变量的方式,硬parse的时间就少了如果是应用上这样,最好还是修改一下应用,通过临时表或者其他的方式,只最好执行一次。需要综合考虑,select dmmc from dwdmb where dmdma.dwdm)这个子查询没有看明白。最后的条件是一个function么。
      

  6.   

    LZ问一下你是怎样得到执行时间的?除了看PL/SQL这些工具的状态栏里显示的时间外,还有没有其他方法?哪位高手了解的话也指点一下,谢了哈。
      

  7.   

    还有其他的方法可以得到SqL的运行时间,在你按下“执行”SQL的同时,按下秒表。 等到SQL执行完了在按下秒表。 秒表显示的时间就是你SQL执行的时间。
    我上小学的百米成绩,老师就是通过这个方法得到的,根本不用什么软件来实现。 o(∩_∩)o...    其实生活中有很多方法你都没有注意。