Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)
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)的更多相关文章
- oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)
1. 简介 Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套允许DBA捕获和保持任意SQL语句执行计划最优的新工具,这样,限制了刷新优化器统计 ...
- Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数
Oracle11g中,为了改善DBMS_STATS包收集统计信息时的唯一值计数功能,增加了 APPROX_COUNT_DISTINCT函数,但文档中未记载.Oracle12c文档中包括了该函数,因此, ...
- Oracle12c中SQL优化(SQL TUNING)新特性之SQL计划指令
SQL计划指令是Oracle12c中自适应查询优化的功能之一.SQL计划指令就像“额外的提醒” ,用以提醒优化器你先前选择了的计划并不是最优的,典型的是因为错误的势评估.错误的势评估往往是由统计信息缺 ...
- Oracle 12cR1中性能优化新特性之全数据库缓冲模式
通常情况下,Oracle会决定哪些数据会留在缓冲区中.当没足够的空间时,数据会被写出内存.此外,为了避免大量读取将有用的信息挤出缓冲区,Oracle对有些操作也许会才去绕过缓冲区的措施.Oracle1 ...
- 盘点 Oracle 11g 中新特性带来的10大性能影响
Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先引起的是一些麻烦,因为对于新技术的不了解.因为对于旧环境的不适应,从Oracle产品到技术服务运维,总是 ...
- 小心SQL SERVER 2014新特性——基数评估引起一些性能问题
在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...
- 11g新特性-自动sql调优(Automatic SQL Tuning)
11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...
- Oracle 11g中的snapshot standby特性
在Oracle 11g中,data guard最吸引人的,除了active data guard的实时查询特性(即可以以只读方式打开物理standby数据库的同时MRP进程能继续做recover),快 ...
- [SQL Server 2014] SQL Server 2014新特性探秘
SQL Server 2014新特性探秘(1)-内存数据库 简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...
随机推荐
- bootstrap 一个简单的登陆页面
效果如图:用bootstrap 写的一个简单的登陆 一.修改样式 样式可以自己调整,例如换个背景色之类的,修改 background-color属性就可以 #from { background-col ...
- Couchbase忘记登录密码怎么办
以下都为root用户操作: 1.先关闭couchbase /opt/couchbase/etc/couchbase_init.d stop 2.切换到下面的路径,删除这个目录下除logs的所有文件,按 ...
- 【Java】0X003 面向对象
一. 什么是面向对象 都说Java是一门面向对象的语言,但什么对象?什么又是面向对象?以下都是我学到的知识和一点自己的理解. 对象是指包含属性和行为的主体. 比如,人有性别.血型.单眼皮或双眼皮等的特 ...
- mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦
以前学习这一块的时候,是说:假设建立了联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引. 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化. 下面是我 ...
- Orm之中介模型
什么是中介模型 中介模型针对的是ManyToMany(多对多)的时候第三张表的问题, 中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就 ...
- 南京邮电大学java第一次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...
- JS面向对象特性和值类型与复合类型
JS面向对象之特性已经值类型与复合类型 一些属性 空对象 空对象也是对象, 只是有存变量的变量名, 没有对象属性 var o ={}; 参数传递 值类型: 函数内外两个变量, 两个数据, 都不相同 ...
- SpringMVC之数据传递二
上一篇学习了从url或view中传数据到Controller中,今天学习下数据从Controller传到view中,主要有4种. 一.ModelAndView 处理方法返回值类型为 ModelAndV ...
- 更换yum源
1. 首先备份 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 使用阿里云的 ...
- Python处理Excel生成CSV文档
Python是一种解释型的.动态数据类型的.面向对象的高级程序设计语言.拥有丰富的处理数据和文本类库,并且得益于它是一种解释型的语言,在程序修改和功能扩展上,可以很容易做到大规模的调整.综合考虑Pyt ...