oracle – 在plsql中的过程中测量sql语句的时间

前端之家收集整理的这篇文章主要介绍了oracle – 在plsql中的过程中测量sql语句的时间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@ 我必须编写一个过程来保存表中任何sql语句的执行时间.

该过程通过exec measureqltime调用(‘sql statement as string’);

我的想法是这样的:

  1. --declarations
  2. timestart NUMBER;
  3. BEGIN
  4. dbms_output.enable;
  5. timestart:=dbms_utility.get_time();
  6. EXECUTE IMMEDIATE sql
  7. COMMIT;
  8. dbms_output.put_line(dbms_utility.get_time()-timestart);
  9. -- save time

但它对我来说对SELECT * …子句不起作用. (我认为sql需要一个INTO订单)

有没有办法在程序中执行任何sql-atatements?

如果您的sql语句是SELECT,则需要从游标中获取以对其执行时间进行有意义的度量.

如果不从游标中获取,则只测量“解析”和“执行”阶段所花费的时间,而大部分工作通常在SELECT语句的“获取”阶段完成.

如果您不知道实际语句将具有的列数,则无法使用EXECUTE IMMEDIATE或OPEN游标FOR’string’进行提取.如果SELECT的列数/类型未知,则必须使用动态sqlDBMS_SQL.

这是一个例子:

  1. sql> CREATE OR REPLACE PROCEDURE demo(p_sql IN VARCHAR2) AS
  2. 2 l_cursor INTEGER;
  3. 3 l_dummy NUMBER;
  4. 4 timestart NUMBER;
  5. 5 BEGIN
  6. 6 dbms_output.enable;
  7. 7 timestart := dbms_utility.get_time();
  8. 8 l_cursor := dbms_sql.open_cursor;
  9. 9 dbms_sql.parse(l_cursor,p_sql,dbms_sql.native);
  10. 10 l_dummy := dbms_sql.execute(l_cursor);
  11. 11 LOOP
  12. 12 EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0;
  13. 13 END LOOP;
  14. 14 dbms_sql.close_cursor(l_cursor);
  15. 15 dbms_output.put_line(dbms_utility.get_time() - timestart);
  16. 16 END;
  17. 17 /
  18.  
  19. Procedure created.
  20.  
  21. sql> exec demo('SELECT * FROM dual CONNECT BY LEVEL <= 1e6');
  22. 744
  23.  
  24. PL/sql procedure successfully completed.

请注意,这将测量获取SELECT的最后一行所需的时间.

猜你在找的Oracle相关文章