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. SpringBoot(六):springboot热部署

    在j2ee项目开发中,热部署插件是JRebel.JRebel的使用为开发人员带来了极大的帮助,且挺高了开发便捷.而在SpringBoot开发生态环境中,SpringBoot热部署常用插件是:sprin ...

  2. hdu2050 折线分割平面---递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2050 题目大意: 求n条折线分割平面的最大数目 思路: 先看n条直线的时候 一条直线 2个平面 两条 ...

  3. jacascript 构造函数、原型对象和原型链

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 先梳理一下定义: 我们通常认为 object 是普通对象,function 是函数对象: Function ...

  4. 使用Markup解析xml文件

    1:怎么获取Markup.cpp 和 Markup.h 首先到http://www.firstobject.com/dn_markup.htm链接下,下载Release 11.5 zip (579k) ...

  5. AFNetworking 源码解读

    最近开始看第三方库优秀源码的计划,这是第一个,AFNetworking来和大家分享一下. AFNetworking 是一个十分优秀的网络框架,简单易用. 在开始之前,最好先了解一下NSURLSessi ...

  6. 基于Mysql 5.7 GTID 搭建双主Keepalived 高可用

    实验环境 CentOS 6.9 MySQL 5.7.18 Keepalived v1.2.13 拓扑图 10.180.2.161 M1 10.180.2.162 M2 10.180.2.200 VIP ...

  7. iOS 检测屏幕是否锁定 🔓 / 🔒

    1. 导入头文件 #import <notify.h> 2. 给 CFNotificationCenter 添加观察者 - (void)addLockStatusObserver { CF ...

  8. Git -> Can't start Git: git.exe

    问题描述 导入别人的PyCharm项目后提示:Can't start Git:git.exe 解决办法 Git就是个类似插件,在Git的官网上注册个账号然后每次编译就会自动把程序上传到网上备份.可以方 ...

  9. 在Unity3D中利用 RenderTexture 实现游戏内截图

    using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; publ ...

  10. 在windows下使用cmd命令全速下载百度云文件

    在windows下使用cmd命令全速下载百度云文件 需要的工具BaiduPCS-GO(链接:https://pan.baidu.com/s/19Sn8gmNi_GZHJwUPu79DPg 密码:gqi ...