`
benx
  • 浏览: 276197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

runstart脚本 测试两个SQL性能

阅读更多

grant select on sys.v_$timer to benx;
grant select on v_$mystat to  benx;
grant select on sys.v_$statname to benx;
grant select on sys.v_$latch to benx;


create or replace view stats as
    select 'STAT...'||a.name name,b.value
    from v$statname a,v$mystat b
    where a.statistic#=b.statistic#
    union all
    select 'LATCH.'||name,gets
    from v$latch;
  

create global temporary table run_stats (
    runid varchar2(15),
    name varchar2(80),
    value int)
    on commit preserve rows;

--包规范runstats_pkg
create or replace package runstats_pkg as
  procedure rs_start;
  procedure rs_middle;
  procedure rs_stop(p_difference_threshold in number default 0);
end;
/

--包体runstats_pkg
create or replace package body runstats_pkg as
  g_start number;
  g_run1  number;
  g_run2  number;

  procedure rs_start is
  begin
    delete from run_stats;
    insert into run_stats
      select 'before', stats.* from stats;
    g_start := dbms_utility.get_time;
  end;

  procedure rs_middle is
  begin
    g_run1 := (dbms_utility.get_time - g_start);
    insert into run_stats
      select 'after 1', stats.* from stats;
    g_start := dbms_utility.get_time;
  end;

  procedure rs_stop(p_difference_threshold in number default 0) is
  begin
    g_run2 := (dbms_utility.get_time - g_start);
    dbms_output.put_line('Run1 ran in' || g_run1 || 'hsecs');
    dbms_output.put_line('Run2 ran in' || g_run2 || 'hsecs');
    dbms_output.put_line('run 1 ran in' || round(g_run1 g_run2 * 100, 2) ||
                         '% of the time');
    dbms_output.put_line(chr(9));
  
    insert into run_stats
      select 'after 2', stats.* from stats;
  
    dbms_output.put_line(rpad('Name', 30) || lpad('Run1', 10) ||
                         lpad('Run2', 10) || lpad('Diff', 10));
  
    for x in (select rpad(a.name, 30) ||
                     to_char(b.value - a.value, '9,999,999') ||
                     to_char(c.value - b.value, '9,999,999') ||
                     to_char(((c.value - b.value) - (b.value - a.value)),
                             '9,999,999') data
                from run_stats a, run_stats b, run_stats c
               where a.name = b.name
                 and b.name = c.name
                 and a.runid = 'before'
                 and b.runid = 'after 1'
                 and c.runid = 'after 2'
                 and (c.value - a.value) > 0
                 and abs((c.value - b.value) - (b.value - a.value)) >
                     p_difference_threshold
               order by abs((c.value - b.value) - (b.value - a.value))) loop
      dbms_output.put_line(x.data);
    end loop;
  
    dbms_output.put_line(chr(9));
    dbms_output.put_line('Run1 latches total versus runs -- difference and pct');
    dbms_output.put_line(lpad('Run1', 10) || lpad('Run2', 10) ||
                         lpad('Diff', 10) || lpad('Pct', 8));
  
    for x in (select to_char(run1, '9,999,999') ||
                     to_char(run2, '9,999,999') ||
                     to_char(diff, '9,999,999') ||
                     to_char(round(run1 / run2 * 100), '999.99') || '%' data
                from (select sum(b.value - a.value) run1,
                             sum(c.value - b.value) run2,
                             sum((c.value - b.value) - (b.value - a.value)) diff
                        from run_stats a, run_stats b, run_stats c
                       where a.name = b.name
                         and b.name = c.name
                         and a.runid = 'before'
                         and b.runid = 'after 1'
                         and c.runid = 'after 2'
                         and a.name like 'LATCH%')) loop
      dbms_output.put_line(x.data);
    end loop;
  end;
end;
/

分享到:
评论

相关推荐

    WinCC_SQL数据库实现数据库同步

    - 打开注册表编辑器 (`Start` -> `Run` -> 输入 `regedit`)。 - 寻找 `[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQLServer\WINCC]` 并在其下新建以下注册项: - `[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft...

    bat+sqlcmd 通过参数形式调用任意存储过程的办法

    例如,如果你有一个接受两个整数参数的存储过程 `usp_MultiplyNumbers`,可以这样写: ``` set /p num1="请输入第一个数字:" set /p num2="请输入第二个数字:" sqlcmd -S <ServerName> -d <DatabaseName> -U ...

    SQL21自学通教程资料.pdf

    如"START"、"EDIT"和"RUN"等,这些都是在SQL*PLUS环境中执行特定操作的命令。 12. 错误处理和事务的回滚 "SET"命令也用于控制错误处理和事务的回滚等高级操作。 从以上内容可以看出,文档覆盖了SQL语言的多个方面...

    PL/SQL教程

    BETWEEN运算符用于在两个值之间选取数据,例如: ```sql SELECT first_name, last_name, start_date FROM s_emp WHERE start_date BETWEEN '09-may-91' AND '17-jun-91'; ``` 这只是一个基础的PL/SQL教程概述,...

    runstats.sql

    `runstats.sql` 是一个用于评估不同方法在 Oracle 数据库上执行效率的测试脚本。此脚本通过对比两种不同方法所需的时间和资源消耗来判断哪种方法更为高效。 #### 二、主要功能介绍 1. **时间差测量**:比较两种...

    SQL_Plus使用手册

    `语句创建了一个名为`test`的表,包含两个字段:`x`和`info`。 #### 四、PL/SQL编程示例 - **插入记录**: - 使用`DECLARE`定义变量,通过`BEGIN...END`块编写循环逻辑,将20条记录插入到`test`表中。 - 示例代码...

    SQL语句的基本查询与排序

    - 示例:`EDIT script.sql`,然后使用`RUN script.sql`来运行该脚本。 #### 七、ORDER BY进行排序输出 - **基本语法**:`SELECT ... FROM ... ORDER BY column_name [ASC | DESC];` - 示例:`SELECT last_name, ...

    Oracle PL SQL 编程手册(SQL大全).docx

    - **BETWEEN**:在指定的两个值之间 - **LIKE**:模式匹配 - **IS NULL**:判断是否为 NULL - **IS NOT NULL**:判断是否不为 NULL 例如,查询哪些职员和分析员: ```sql SELECT ENAME, JOB FROM EMP WHERE JOB IN ...

    oracle9i handbook的sctipt

    2. **apps_start.ksh 和 apps_stop.ksh**:这两个脚本分别用于启动和停止与 Oracle 9i 集成的应用程序。在数据库服务启动或关闭时,这些脚本确保所有相关应用程序的生命周期管理得到正确处理,防止数据丢失或应用...

    测试培训教材

    切换到“执行流”界面,添加“Sign-On Password”和“Sign-On User Name”两个测试用例: 右键选择“Sign-On User Name”,选择“测试运行计划” 新建执行条件: 设置“Sign-On User Name”的时间...

    SQLPLUS命令的使用大全

    这两个命令等效,用于执行名为`file_name.sql`的脚本文件。这种方式类似DOS批处理,适用于自动化执行复杂查询或批量更新操作。 ### 二、编辑当前输入 `EDIT`命令允许用户在执行前对输入的SQL语句进行编辑修改,...

    oracle常用的sql语句

    假设有一个名为`employees`的表,其中包含`salary`(月薪)和`months_worked`(工作月数)两个字段,则可以使用`SELECT salary * months_worked AS annual_salary FROM employees;`来计算年薪。 ##### 6.5 将查询出来的...

    Oracle 编程手册(SQL大全)

    - `START`: 同`RUN`命令。 - `TIMING`: 开启或关闭SQL执行时间的显示。 - `TTITLE`: 设置屏幕顶部标题。 #### 二、数据库查询与数据字典 - **数据字典视图**:用于查询有关数据库对象的信息,例如: - `TAB`: ...

    LoadRunner问题解决方案

    - 对于lm70.dll和mlr5lprg.dll这两个文件,它们分别与LoadRunner的许可证支持和许可证存储有关。若遇到许可证问题,可以尝试替换这些文件,并在LR的许可证管理器中添加新的许可证。 - 如果许可证验证失败,除了...

    学习Oracle过程中几个常见问题的总结

    本文主要讨论两个常见的问题:如何找出并处理无用的索引以及如何监控长时间运行的DML操作。 首先,无用索引是导致Oracle数据库性能下降的一个重要因素。当数据库管理员在WHERE子句中涉及的每一列都创建索引时,尽管...

    SQLPLUS在Bash_shell的使用

    - `START` 或 `@` 命令用于执行SQL脚本,如 `SQL> START file_name` 或 `SQL> @ file_name`。 - `SPOOL` 命令用来将输出重定向到文件,如 `SQL> SPOOL file_name`,结束时使用 `SQL> SPOOL OFF`。 - 改变列的显示...

    Oracle学习(比较齐全的介绍)

    **连接查询**用于从两个或多个表中获取数据。 ##### 1. SQL92语法 使用老式语法进行连接: ```sql SELECT * FROM table1, table2 WHERE table1.column_name = table2.column_name; ``` ##### 2. SQL99语法 使用...

    ORACLE SQLPLUS命令使用大全.doc

    如果想要再次执行最后一条SQL语句,可以输入`SQL> /`或`SQL> run`命令。 4. **输出重定向** `SQL> SPOOL file_name`命令将屏幕上的输出内容保存到指定的文件中,包括你的SQL语句和结果集。不过,只有在关闭spool...

    Oracle_PLSQL_编程手册(SQL大全)

    - `RUN`:运行外部文件中的 SQL 脚本。 - `ACCEPT`:从用户接收输入值。 - `DOCUMENT`:生成文档。 - `SAVE`:保存输出到文件。 - `APPEND`:将输出追加到文件末尾。 - `EDIT`:编辑 SQL 文件。 - `SET`:...

    SQLPLUS命令的使用大全.doc

    首先,你可以通过以下两种方式执行一个SQL脚本文件: 1. `SQL> start file_name` 或 2. `SQL> @ file_name` 这两个命令都可以读取并执行指定文件中的SQL语句,这对于执行多条连续的操作或者批量数据处理非常有用,...

Global site tag (gtag.js) - Google Analytics