Oracle11g中,真实应用测试选项(the Real Application Testing Option)提供了一个有用的特点,叫SQL性能分析器(SQL Performance Analyzer,SQLPA,SPA)。系统包DBMS_SQLPA让你可以注册和比较SQL调优集(STS)中的SQL语句执行的统计信息。通过SQL性能分析器,可比较数据库变化前后SQL语句的执行情况。下面将通过简单例子说明该Oracle 11g 新特点。

1.  创建样例表和数据

为了稍后的说明,首先,需创建一张表和往表中加一些数据,脚本如下:

create table test

(idnumber not null);

begin

for i in 1..10000 loop

insert into test(id)

values (i);

end loop;

commit;

end;

/

2.  运行SQL语句并获取执行计划

登录SQL*Plus并运行SQL语句:

set serveroutput off

col id format 99999

select a.id, b.id

from testa, test b

wherea.id=b.id

andb.id=500;

select * from table(

dbms_xplan.display_cursor);

其执行计划如下,记住其SQL_ID并将会添加到后面部分SQL调优集中的查询语句中:

-------------------------------------

SQL_ID 683kdkrs2dmrk, child number 0

-------------------------------------

select a.id, b.id   from test a, test b  where a.id=b.id

and b.id=500

Plan hash value: 2625395012

----------------------------------------------------------------

| Id  |Operation          | Name | Rows  | Bytes | Cost (%CPU)|

----------------------------------------------------------------

|   0 |SELECT STATEMENT   |      |      |       |    15 (100)|

|*  1|  HASH JOIN         |     |     1 |    26 |   15   (7)|

|*  2|   TABLE ACCESS FULL| TEST |     1 |   13 |     7   (0)|

|*  3|   TABLE ACCESS FULL| TEST |     1 |   13 |     7   (0)|

----------------------------------------------------------------

Predicate Information (identified byoperation id):

---------------------------------------------------

1 -access("A"."ID"="B"."ID")

2 - filter("A"."ID"=500)

3 - filter("B"."ID"=500)

Note

-----

- dynamic sampling used for this statement

3. 捕获SQL调优集查询

一旦SQL语句位于共享池中,就可以创建一个新的SQL调优集,并向其中增加SQL语句:

1)   创建一个STS:

BEGIN

DBMS_SQLTUNE.CREATE_SQLSET(

sqlset_name => 'test_sts',

description => 'STS for SPA demo');

END;

/

2)   通过查询游标缓冲向STS中增加查询:

DECLARE

l_cursor DBMS_SQLTUNE.sqlset_cursor;

BEGIN

OPENl_cursor FOR

SELECT VALUE(p)

FROM   TABLE (

DBMS_SQLTUNE.select_cursor_cache(

'sql_id = ''&sql_id''', -- basic_filter

NULL, -- object_filter

NULL, -- ranking_measure1

NULL, -- ranking_measure2

NULL, -- ranking_measure3

NULL, -- result_percentage

1)    -- result_limit

) p;

DBMS_SQLTUNE.load_sqlset (

sqlset_name    => 'test_sts',

populate_cursor => l_cursor);

END;

/

accept sql_id prompt "Enter value forsql_id: "

683kdkrs2dmrk

PL/SQL procedure successfully completed.

3)   可查询STS内容以确定该SQL已被正确注册:

col sql format a50

set lines 120

SELECT sql_id,

substr(sql_text, 1, 50) sql

FROMTABLE(

DBMS_SQLTUNE.select_sqlset (

'test_sts'));

SQL_ID       SQL

------------- ---------------------

683kdkrs2dmrk select a.id, b.id

from test a, test b

where a.i

3.  改变数据库前,生成和存储该SQL语句执行统计信息

该步骤可能会花费一些时间,因为要运行STS查询和存储其执行统计信息。按顺序执行如下步骤:

1)  创建一个参考STS的SQLPA分析任务

var v_out char(50)

begin

:v_out:=dbms_sqlpa.create_analysis_task(

sqlset_name => 'test_sts',

task_name   => 'test_spa_task');

end;

/

print v_out

V_OUT

-------------

test_spa_task

2)  检查该任务是否已创建:

col TASK_NAME format a14

col ADVISOR_NAME format a24

select TASK_NAME,

ADVISOR_NAME,

created

fromDBA_ADVISOR_TASKS

wheretask_name='test_spa_task';

TASK_NAME     ADVISOR_NAME             CREATED

-------------- ---------------------------------

test_spa_task SQL Performance Analyzer 15-AUG-07

3)  运行该SQLPA分析任务:

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name      => 'test_spa_task',

execution_type => 'TEST EXECUTE',

execution_name => 'test_spa_task_before');

end;

/

4)  监视该任务及其状态,直到任务完成:

col TASK_NAME format a20

select execution_name,

status,

execution_end

fromDBA_ADVISOR_EXECUTIONS

wheretask_name='test_spa_task'

orderby execution_end;

EXECUTION_NAME                 STATUS      EXECUTION

------------------------------ --------------------

test_spa_task_before           COMPLETED   15-AUG-07

5)  改变数据库

在表TEST上创建一个索引:

create unique index test_idx on test(id);

Index created.

6)  改变数据库后,运行该SQLPA分析任务

该脚本和前面类似。只是需改变名字以区别数据库改变前后的执行统计信息:

Ø 运行SQLPA分析任务:

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name      => 'test_spa_task',

execution_type => 'TEST EXECUTE',

execution_name => 'test_spa_task_after');

end;

/

Ø 监视该任务及其状态,直到其完成:

col TASK_NAME format a20

select execution_name,

status,

execution_end

fromDBA_ADVISOR_EXECUTIONS

wheretask_name='test_spa_task'

orderby execution_end;

EXECUTION_NAME                 STATUS      EXECUTION

------------------------------ --------------------

test_spa_task_before           COMPLETED   15-AUG-07

test_spa_task_after            COMPLETED   15-AUG-07

7. 比较因数据库改变而发生的执行改变

需再次运行分析任务,这次分析器将比较和存储比较结果:

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name        => 'test_spa_task',

execution_type   => 'COMPAREPERFORMANCE',

execution_name   => 'test_spa_task_compare',

execution_params => dbms_advisor.arglist(

'comparison_metric',

'buffer_gets'));

end;

/

PL/SQL procedure successfully completed.

一旦完成,就可如下这样用REPORT_ANALISIS_TASK打印分析报告:

variable rep CLOB;

begin

:rep:= DBMS_SQLPA.REPORT_ANALYSIS_TASK(

task_name=>'test_spa_task',

type=>'HTML',

level=>'ALL',

section=>'ALL');

end;

/

SET LONG 100000

set LONGCHUNKSIZE 100000

set LINESIZE 200

set head off

set feedback off

set echo off

spool sts_changes.html

PRINT :rep

spool off

set head on

建议SECTION参数置为SUMMARY或ALL,而不非DBMS_SQLPA文档中说的置为SECTION_ALL那样。

可通过SQL*Plus(文本输出)或浏览器(HTML输出)浏览生成的报告结果:

8. 另一个显示比较结果的方法:

除了打印报告,还可从下面视图中查询报告:

Ø DBA_ADVISOR_FINDINGS

Ø DBA_ADVISOR_SQLPLANS

Ø DBA_ADVISOR_SQLSTATS

9. 清除执行统计信息、分析任务及相关表

1)   重置任务结果:

begin

dbms_sqlpa.reset_analysis_task(task_name=>'test_spa_task');

end;

/

col TASK_NAME format a20

select execution_name,

status,

execution_end

fromDBA_ADVISOR_EXECUTIONS

wheretask_name='test_spa_task'

orderby execution_end;

no rows selected

2)   清除任务本身:

begin

dbms_sqlpa.drop_analysis_task(task_name=>'test_spa_task');

end;

/

col TASK_NAME format a14

col ADVISOR_NAME format a24

select TASK_NAME,

ADVISOR_NAME,

created

fromDBA_ADVISOR_TASKS

wheretask_name='test_spa_task';

no rows selected

3)   此外,还可以:

Ø  用过程cancel_analysis_task 取消正运行的分析任务。

Ø  用过程interrupt_analysis_task暂停运行的分析任务。

Ø  用过程resume_analysis_task恢复被暂停的分析任务。

Ø  清除相关表和索引:

drop table gark cascade constraints purge;

10. 总结

针对SQLPA做如下总结:

Ø 可轻松从AWR中捕获STS中SQL语句。

Ø 不必重建测试系统(仅INSERT/UPDATE/DELETE语句的SELECT部分被执行)。

Ø STS中SQL语句仅是真实应用负载的一个样例。

具体请参考:

Ø Oracle 11gPerformance Tuning Guide – 23.SQL Performance Analyzer

Ø Oracle 11g PL/SQLTypes and Packages Reference – DBMS_SQLPA

Oracle11g Reference

Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)的更多相关文章

  1. oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)

    1.   简介 Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套允许DBA捕获和保持任意SQL语句执行计划最优的新工具,这样,限制了刷新优化器统计 ...

  2. Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数

    Oracle11g中,为了改善DBMS_STATS包收集统计信息时的唯一值计数功能,增加了 APPROX_COUNT_DISTINCT函数,但文档中未记载.Oracle12c文档中包括了该函数,因此, ...

  3. Oracle12c中SQL优化(SQL TUNING)新特性之SQL计划指令

    SQL计划指令是Oracle12c中自适应查询优化的功能之一.SQL计划指令就像“额外的提醒” ,用以提醒优化器你先前选择了的计划并不是最优的,典型的是因为错误的势评估.错误的势评估往往是由统计信息缺 ...

  4. Oracle 12cR1中性能优化新特性之全数据库缓冲模式

    通常情况下,Oracle会决定哪些数据会留在缓冲区中.当没足够的空间时,数据会被写出内存.此外,为了避免大量读取将有用的信息挤出缓冲区,Oracle对有些操作也许会才去绕过缓冲区的措施.Oracle1 ...

  5. 盘点 Oracle 11g 中新特性带来的10大性能影响

    Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先引起的是一些麻烦,因为对于新技术的不了解.因为对于旧环境的不适应,从Oracle产品到技术服务运维,总是 ...

  6. 小心SQL SERVER 2014新特性——基数评估引起一些性能问题

    在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...

  7. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  8. Oracle 11g中的snapshot standby特性

    在Oracle 11g中,data guard最吸引人的,除了active data guard的实时查询特性(即可以以只读方式打开物理standby数据库的同时MRP进程能继续做recover),快 ...

  9. [SQL Server 2014] SQL Server 2014新特性探秘

    SQL Server 2014新特性探秘(1)-内存数据库   简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...

随机推荐

  1. JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换

    首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是j ...

  2. ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查

    身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了.我们来看看在Core里面如何配置: 首先需要NuGet安装一个包:Microsoft.AspNetCore.Authent ...

  3. antd 主题色

    如果是自己配置的reac项目,而非官方推荐的creat-react-app或者dva-cli等阿里自己开发的脚手架去引入antd,会有两个问题 第一,用babel-plugin-import设置sty ...

  4. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  5. 老男孩python学习之作业二---三级菜单

    因为之前花力气完成了购物小程序的作业 现在做这个三级菜单简直是so easy!! 1.显示省级菜单 2.交互,提示用户输入要查看的省份(退出e) 2.1.用户正确输入列表中的省份 3.显示市级菜单 3 ...

  6. Spark:性能调优

    来自:http://blog.csdn.net/u012102306/article/details/51637366 资源参数调优 了解完了Spark作业运行的基本原理之后,对资源相关的参数就容易理 ...

  7. C语言 左值、右值

    左值就是在赋值中可以放在赋值操作符两边的值 右值则是只可以放在赋值操作符右边的值 ++i是直接给i变量加1,然后返回i本身,因为i是变量,所以可以被赋值,因此是左值表达式i++现产生一个临时变量,记录 ...

  8. CodeForces 916E Jamie and Tree(树链剖分+LCA)

    To your surprise, Jamie is the final boss! Ehehehe. Jamie has given you a tree with n vertices, numb ...

  9. Oracle数据库基础练习题

    --1.查询和SMITH相同部门的员工姓名和雇用日期select ename,hiredate from emp where deptno=(select deptno from emp where ...

  10. 使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...