SQL Tuning Advisor简单使用

SQL Tuning Advision是Oracle提供的一个功能包,可以针对有性能问题的SQL给出优化建议。可以作为调优的辅助手段。


建立测试表和索引
create table t_1 as select * from dba_objects;
create table t_2 as select * from dba_tables;
create index idx_t_2_ts on t_2(tablespace_name);

begin
  dbms_stats.gather_table_stats(ownname => user,tabname => 'T_1',cascade => true);
  dbms_stats.gather_table_stats(ownname => user,tabname => 'T_2',cascade => true);
end;
/

假设的SQL。 这些语句运行很慢,需要优化
-- stmt 1
select t2.*
  from t_1 t1, t_2 t2
 where t1.owner = t2.owner
   and t1.object_name = t2.table_name
   and t2.blocks > 10
   and t2.tablespace_name = 'USERS';

-- stmt 2
select t1.* from t_1 t1 where t1.object_type = 'TABLE';

使用SQL Tuning Advisor,察看系统提供的优化方案


Single SQL Statement

当仅仅需要察看单条语句的时候,可以直接把SQL作为参数创建一个Task

 

-- drop a sql tuning task
begin
dbms_sqltune.drop_tuning_task(task_name => 'my_sql_tuning_task');
end;
/

-- create a sql tuning task
declare
l_task_name varchar2(30);
l_sqltext clob;
begin
l_sqltext := --
'select t2.*
from t_1 t1, t_2 t2
where t1.owner = t2.owner
and t1.object_name = t2.table_name
and t2.blocks > :p1
and t2.tablespace_name = :p2
';
l_task_name := dbms_sqltune.create_tuning_task --
(sql_text => l_sqltext,
bind_list => sql_binds(anydata.ConvertNumber(10),
anydata.ConvertVarchar2('USERS')),
user_name => user,
scope => dbms_sqltune.SCOPE_COMPREHENSIVE,
time_limit => 60,
task_name => 'my_sql_tuning_task');
end;
/

select l.task_name,l.status from dba_advisor_log l where l.owner = user;

-- execute a sql tuning task
begin
dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task');
end;
/

-- check the running progress
select p.sofar, p.totalwork
from v$advisor_progress p, dba_advisor_log l
where p.task_id = l.task_id
and l.task_name = 'my_sql_tuning_task';

-- display the result
set long 1000000
set linesize 100
select dbms_sqltune.report_tuning_task('my_sql_tuning_task') from dual;

节选部分结果
-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------
 
1- Index Finding (see explain plans section below)
--------------------------------------------------
  The execution plan of this statement can be improved by creating one or more
  indices.
 
  Recommendation (estimated benefit: 100%)
  ----------------------------------------
  - Consider running the Access Advisor to improve the physical schema design
    or creating the recommended index.
    create index T2_1_12_6_A.IDX$$_7DCA0001 on
    T2_1_12_6_A.T_2('TABLESPACE_NAME','BLOCKS');
 
  - Consider running the Access Advisor to improve the physical schema design
    or creating the recommended index.
    create index T2_1_12_6_A.IDX$$_7DCA0002 on
    T2_1_12_6_A.T_1('OWNER','OBJECT_NAME');
 
  Rationale
  ---------
    Creating the recommended indices significantly improves the execution plan
    of this statement. However, it might be preferable to run "Access Advisor"
    using a representative SQL workload as opposed to a single statement. This
    will allow to get comprehensive index recommendations which takes into
    account index maintenance overhead and additional space consumption.
 
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
 
1- Original
-----------
Plan hash value: 3244836478
 
--------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |            |     1 |   250 |   364   (2)|
|*  1 |  HASH JOIN                   |            |     1 |   250 |   364   (2)|
|*  2 |   TABLE ACCESS BY INDEX ROWID| T_2        |     1 |   216 |     3   (0)|
|*  3 |    INDEX RANGE SCAN          | IDX_T_2_TS |    43 |       |     1   (0)|
|   4 |   TABLE ACCESS FULL          | T_1        |   148K|  4946K|   360   (1)|
--------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("T1"."OWNER"="T2"."OWNER" AND "T1"."OBJECT_NAME"="T2"."TABLE_NAME"
   2 - filter("T2"."BLOCKS">:P1)
   3 - access("T2"."TABLESPACE_NAME"=:P2)
 
2- Using New Indices
--------------------
Plan hash value: 1060650565
 
--------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%C
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |     1 |   250 |     3
|   1 |  NESTED LOOPS                |                |     1 |   250 |     3
|   2 |   TABLE ACCESS BY INDEX ROWID| T_2            |     1 |   216 |     2
|*  3 |    INDEX RANGE SCAN          | IDX$$_7DCA0001 |     1 |       |     1
|*  4 |   INDEX RANGE SCAN           | IDX$$_7DCA0002 |     1 |    34 |     1
--------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("T2"."TABLESPACE_NAME"=:P2 AND "T2"."BLOCKS">:P1 AND "T2"."BLOCKS"
              NOT NULL)
   4 - access("T1"."OWNER"="T2"."OWNER" AND "T1"."OBJECT_NAME"="T2"."TABLE_NAME"
 
-------------------------------------------------------------------------------

SQL Tuning Set
当需要对多条语句进行察看的时候,可以使用STS。


STS可以从多种数据源(CursorCache, AWR, STS)获取SQL,这里我们从Cache中取得我们关心的几条。
SQL> select sql_id, sql_text from v$sql where lower(sql_text) like 'select t_.*%';
 
SQL_ID        SQL_TEXT
------------- --------------------------------------------------------------------------------
7rucbfq8vcr7d select t1.*   from t_1 t1    where t1.object_type = 'TABLE'
588rxmp05xt7g select t2.*   from t_1 t1, t_2 t2  where t1.owner = t2.owner    and t1.object_na

STS中实际包含的是一些sys.sqlset_row对象,他的属性可以作为筛选的条件
SQL> desc dbms_sqltune.select_cursor_cache
Parameter         Type       Mode Default?
----------------- ---------- ---- --------
(RESULT)          SYS.SQLSET              
BASIC_FILTER      VARCHAR2   IN   Y       
OBJECT_FILTER     VARCHAR2   IN   Y       
RANKING_MEASURE1  VARCHAR2   IN   Y       
RANKING_MEASURE2  VARCHAR2   IN   Y       
RANKING_MEASURE3  VARCHAR2   IN   Y       
RESULT_PERCENTAGE NUMBER     IN   Y       
RESULT_LIMIT      NUMBER     IN   Y       
ATTRIBUTE_LIST    VARCHAR2   IN   Y       
-- preview the STS contents
select t.*
  from table(dbms_sqltune.select_cursor_cache('sql_id in (''588rxmp05xt7g'',''7rucbfq8vcr7d'')')) t;

找到我们关心的sql_id之后,用这个条件构造STS

 

-- create a STS
begin
dbms_sqltune.create_sqlset(sqlset_name => 'my_sts');
end;
/

-- load STS using cursor cache
declare
l_cur dbms_sqltune.sqlset_cursor;
begin
open l_cur for
select value(t)
from table(dbms_sqltune.select_cursor_cache('sql_id in (''588rxmp05xt7g'',''7rucbfq8vcr7d'')')) t;

dbms_sqltune.load_sqlset(sqlset_name => 'my_sts', populate_cursor => l_cur);
end;
/

-- display contents of STS
select * from table(dbms_sqltune.select_sqlset('my_sts'));

-- drop a sql tuning task
begin
dbms_sqltune.drop_tuning_task(task_name => 'my_sql_tuning_task');
end;
/

-- create a sql tuning task by using STS
declare
l_task_name varchar2(30);
l_sqltext clob;
begin
l_task_name := dbms_sqltune.create_tuning_task --
(sqlset_name => 'my_sts',
scope => dbms_sqltune.SCOPE_COMPREHENSIVE,
time_limit => 60,
task_name => 'my_sql_tuning_task');
end;
/

继续后面的执行和察看步骤(略)

转载于:https://www.cnblogs.com/wait4friend/archive/2012/02/01/2334614.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Multi GET API介绍

#先添加几个文档 PUT /lib/user/1 {"first_name":"Jane","last_name":"Smith","age":36,"about":"I like to collect rock albums","interests":["music"] }PUT /lib/user/2 {&qu…

Word2Vec学习笔记(二)

二、语言模型 语言模型可以分为文法型模型和统计语言模型。在实际应用中语言识别、手写体文字识别、机器翻译、键盘输入、信息检索等研究领域都用到了语言模型。文法型语言模型是人工编制的语言学文法,文法规则来源于语言学家掌握的语言学知识和领域知识&#xff0c…

echo中使用逗号和句号的区别

echo中是可以用逗号来连接字符串的.经过测试.这样的连接字符串方式要比直接用点号要快. //PHP是先连接字符串再进行加法计算了.按照从左向右的方向进行的。//如果将一个字符串强制转换成一个数字.PHP会去搜索这个字符串的开头.如果开头是数字就转换.如果不是就直接返回0echo 51…

Multi GET  API

Multi GET API介绍 GET /lib/user/_mget {"docs":[{"_id":1},{"_type":"user","_id":2}] } #返回值 {"docs" : [{"_index" : "lib","_type" : "user","_id&qu…

Word2Vec学习笔记(三)

三、Hierarchical Softmax模型 3.1 词向量 词向量目前常用的有2种表示方法,One-hot representation 和 distributed representation. 词向量,顾名思义就是将一个词表示为向量的形式,一个词,怎么可以将其表现为向量呢?…

Thrift 教程 开发 笔记 原理 资料 使用 范例 示例 应用

在这里汇总一下:thrift版本差异和源码及jar包下载。文档,示例(脚本、代码、),白皮书,常见问题。 有很内容是重复的,给位看官自行过滤。 英文资料 API 使用介绍 原理简介(推荐阅读) 和 简单范例 IBM developerWorks 详细…

Bulk API实现批量操作

Bulk 批量操作 (1) 比如,我这里,在$ES_HOME里,新建一文件,命名为requests。(这里为什么命名为request,去看官网就是)在Linux里,有无后缀没区别。 1 2 3 4 5…

Word2Vec学习笔记(三)续

三、(续)Skip-gram模型介绍 Skip-gram模型并不是和CBOW模型相反的,它们的目的都是计算出词的向量,只不过在作者的论文中给出的图看样子是反的而已。Skip-gram模型是用每个当前词去预测一定范围内除当前词之外前后的词。同样的&…

三省吾身

自尊心极强,极其自信又极其自卑极其理性又极其感性,平时把自卑隐藏在自信中,因为自卑和感性易冲动发火脾气暴躁,性格非常矛盾。知己知彼。 成熟包容宽恕平和气定神闲。 每日看此,三省吾身。 一定要宽容,如果…

我的博客开通了

一直都比较关注博客园,也一直很想写博客,最近几年发现自己做了很多项目,但好多东西没有很多的积累下来,每次都要从网上搜索别人的东西,感觉太失败! 从今天开始,我也要做一个有故事的程序员&…

ElasticSearch关于映射mapping介绍

#首先我们还是先增加几个文档 PUT /myindex/article/1 {"post_date": "2020-03-14","title": "Java","content": "java is the best language","author_id": 119 }PUT /myindex/article/2 {"post…

最优化学习笔记(五)——牛顿法(多维数据)

在最优化学习系列中,第一次就说的是牛顿法,但是那是在一维搜索上的,它其实就是将函数f在x处利用泰勒公式展开,得到它的近似函数,进而求解最小值。本节内容主要说明牛顿法在多维数据上的迭代公式。最优化学习笔记中讲到…

ElasticSearch的Object数据类型

上一篇mapping文章我们知道数字类型和日期类型要精确查找,以及mapping的两个重要的作用。 所以创建索引的时候,是不是可以预先定义字段的类型以及相关属性,这样就能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理…

Word2Vec学习笔记(四)——Negative Sampling 模型

前面讲了Hierarchical softmax 模型,现在来说说Negative Sampling 模型的CBOW和Skip-gram的原理。它相对于Hierarchical softmax 模型来说,不再采用huffman树,这样可以大幅提高性能。 一、Negative Sampling 在负采样中,对于给定…

ElasticSearch手动创建mapping

前面也提到过关于手动创建mapping,接着上一篇关于object类型存储以及mapping的介绍,我们接下来就介绍下如何手动创建mapping #手动创建mapping PUT /lib6 {"settings":{"number_of_shards" : 3,"number_of_replicas" : 0…

Array.prototype.slice.call

Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0),但因为arguments不是真正的Array,所以它没有slice这个方法.能用slice方法的,只要有length属性就行。虽然arguments有length属性,但是没有slice方法&#xff0…

Word2Vec学习笔记(五)——Negative Sampling 模型(续)

本来这部分内容不多,是想写在negative sampling 中和cbow一起的,但是写了后不小心按了删除键,浏览器直接回退,找不到了,所以重新写新的,以免出现上述情况 (接上) 三、Negative Sampling 模型——Skip-gra…

ElasticSearch基本查询一(英文分词)

废话不多说首先准备数据,我们先添加几个文档 PUT /lib3/user/1 { "name" : "zhaoliu","address" :"hei long jiang sheng tie ling shi","age" : 50,"birthday" : "1970-12-12","inte…

HDU1071_数学几何

题目大意: 给你三个点p1,p2,p3,p1是最高点,然后算出面积。 解题思路: 我的解题思路有点水,就是直接求抛物线系数,直线系数,最后求积分搞定e.尽量少用中间变量吧。代码有点丑。虽然这道题目是1a,…

机器学习笔记(十一)——逻辑回归

一、引言 虽然说是逻辑回归,其实既可以用它做回归,也可以用它做分类。一般我们从最简单的二分类问题开始了解他,当然也可以做多分类。 二、Logistic Regression 的一般步骤 找一个合适的假设构造损失函数让损失函数最小,求出对应…