BEGIN
dbms_output.put_line(to_char(sysdate,'--hh24:mi:ss--'));  
dbms_output.put_line(to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6'));  SQL_STR1 := 'SELECT MEASURE_DATE,LATITUDE,LONGITUDE,STRG_EC_IO FROM T_CAD 
WHERE ((MEASURE_DATE BETWEEN to_date(''2005-09-30 15:00:00'', ''yyyy-mm-dd hh24:mi:ss'') 
AND to_date(''2005-09-30 15:59:59'', ''yyyy-mm-dd hh24:mi:ss''))) AND 
((LATITUDE BETWEEN 35.665 AND 35.67 AND LONGITUDE BETWEEN 139.71 AND 139.715)) 
ORDER BY MEASURE_DATE';  
execute IMMEDIATE  SQL_STR1; SQL_STR2 := 'select to_char(systimestamp, ''yyyymmdd hh24:mi:ss.ff6'') from dual';
 execute IMMEDIATE  SQL_STR2;
dbms_output.put_line(to_char(sysdate,'--hh24:mi:ss--'));  
dbms_output.put_line(to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6'));  
END--10:49:08--
20080526 10:49:08.732000
--10:49:08--
20080526 10:49:08.732000
根据结果我请问我这SQL难道说执行时间真的连1毫秒都没花费??

解决方案 »

  1.   

    你单独执行下SQL看看执行时间
      

  2.   

    由于systimestamp的精度并没有达到1/1000秒。在oracle 10.2.0.1 for 32-bit windows下测试,精度大约只有15/1000-16/1000秒。
      

  3.   

    我用PLSQLDEVELOPER 执行30 ROWS SELECTED IN 0.05 SECONDS全部展开结果是236ROWS SELECTED IN  0.231 SECONDS
      

  4.   

    真的假的,有这么快?
    另外,感觉你这种看时间不太准。毕竟不是debug,或许是在内存里一起执行的
      

  5.   

    STAT #4 id=1 cnt=236 pid=0 pos=1 obj=0 op='SORT ORDER BY (cr=2281 pr=2075 pw=0 time=833900 us)'
    STAT #4 id=2 cnt=236 pid=1 pos=1 obj=60567 op='TABLE ACCESS FULL T_CAD (cr=2281 pr=2075 pw=0 time=444627 us)'
    我用TRACE 看的执行时间.....和 我写的PLSQL执行时间对比就知道有出入
      

  6.   

    难道说真的连1毫秒都没,, 我担心的是执行了一次后就放到内存执行 那个速度就不是执行想要的执行速度了...杂处理下让每次都跑第一次的状态不放到内存里呢.
    放内存是ORACLE自带的功能...
      

  7.   

    不奇怪啊,7W数据量很小的,相应字段有建索引的话这个速度是正常的:
    SQL> select count(*) from t4;  COUNT(*)
    ----------
        100000  1  declare
      2  SQL_STR1 varchar2(200);
      3  SQL_STR2 varchar2(200);
      4  BEGIN
      5  dbms_output.put_line(to_char(sysdate,'--hh24:mi:ss--'));
      6  dbms_output.put_line(to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6'));
      7  SQL_STR1 := 'select rn from t4 where rn between 100 and 120';
      8  execute IMMEDIATE  SQL_STR1;
      9   SQL_STR2 := 'select to_char(systimestamp, ''yyyymmdd hh24:mi:ss.ff6'') fro
    m dual';
     10   execute IMMEDIATE  SQL_STR2;
     11  dbms_output.put_line(to_char(sysdate,'--hh24:mi:ss--'));
     12  dbms_output.put_line(to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6'));
     13* END;
    11:08:41 SQL> /
    --11:08:53--
    20080526 11:08:53.843000--11:08:53--
    20080526 11:08:53.843000
      

  8.   

    declare
      v_sql varchar2(32767);
      --cursor cur is select * from person;
    begin
      v_sql := 'select * from person';
      execute immediate v_sql;
    end;SQL> /
     
    PL/SQL procedure successfully completed
     
    Executed in 0.016 secondsSQL> /
     
    PL/SQL procedure successfully completed
     
    Executed in 0 secondsSQL> select count(*) from person;
     
      COUNT(*)
    ----------
       4800001
     
    Executed in 1.484 seconds有cursor 那句是 0.016无cursor 那句是 0.000结论:PL/SQL 解释这种无左值查询时可能偷了什么懒 或者做了什么处理 比如多线,抛弃(猜测,不知道如何证明,期待高手现身)。