SQL Profile 总结(一)

一、前提概述

在介绍SQL Profile之前,不得不说的一个工具就是SQL Tuning Advisor;这个工具是从Oracle 10g開始引入,它的任务就是分析一个指定的SQL语句,并建议怎样使用一些方法来提高指定语句的性能,比如:收集缺失的对象统计信息、或者收集过时的对象统计信息、创建新的索引、调整SQL语句结构、採用SQL Profile等等方式。

二、为什么SQL Tuning Advisor可以找出提高语句性能的方法?

这须要从SQL Tuning Advisor的工作原理開始说明,例如以下

1、首先SQL Tuning Advisor将给定的SQL语句委派给Automotic Tuning Optimizer来完毕

2、Automotic Tuning Optimizer为Oracle查询优化器的一部分

3、Automotic Tuning Optimizer能够花较长的时间来产生一个高效的运行计划,比如:

  • 能够使用耗时的技术如如果分析(what-if),并加强对动态採样技术的利用来核实它的预计值
  • 能够执行实际执行计划中的多个步骤,并将得出的实际值与优化器评估的预计值相比較,来验证优化器最初的预计

注意:

1、尽管Automotic Tuning Optimizer为Oracle查询优化器的一部分,优化器无法再第一时间找到高效的运行计划,而Automotic Tuning Optimizer能够找到的原因主要是两者的工作职责不同。在正常情况下,优化器必须以最快的速度产生运行计划(秒级以内),而另外一个工具能够花较长时间来寻找高效的运行计划!

2、SQL Tuning Advisor并不一定每次到能找到高效的运行计划

3、SQL Tuning Advisor生成的建立,我们一定要细致阅读,并依据实际情况来决定是否採用这些建议

三、SQL Tuning Advisor简单概述

SQL Tuning Advisor的核心接口是通过dbms_sqltune程序包来提供的,能够接受的SQL语句类型例如以下4种

  1. SQL语句文本
  2. 存储在共享池中的SQL语句,指定SQL_ID就可以
  3. 存储在AWR资料库中的SQL语句,指定SQL_ID就可以
  4. SQL调优集的名称(能够看做是存储一系列SQL语句以及相关信息的对象集合)

四、封装的存储过程

依据实际使用,一般都是指定SQL_ID来进行优化,因此,我创建了一个存储过程,指定sql_id參数后,会自己主动进行sql优化,并打印出查看报告的方法,例如以下(以SYS用户执行):

create or replace procedure p_create_sqltuning_task(p_sql_id varchar2) is

v_tuning_task varchar2(30);

v_sql_id v$session.sql_id%type;

begin

v_sql_id := p_sql_id;

v_tuning_task := dbms_sqltune.create_tuning_task(sql_id => v_sql_id);

dbms_sqltune.execute_tuning_task(v_tuning_task);

dbms_output.put_line(‘This Tuning task name is :   ‘|| v_tuning_task);

dbms_output.put_line(‘-------------Please using follow command query SQL tuning report!------------‘);

dbms_output.put_line(‘set linesize 200 pagesize 9999‘);

dbms_output.put_line(‘set long 100000‘);

dbms_output.put_line(‘select dbms_sqltune.report_tuning_task(‘‘‘||v_tuning_task||‘‘‘) from dual;‘);

end;

/

理论知识都相对枯燥,我们来看一个详细的測试;

五、演示样例

一、执行SQL tuning advisor

SQLexec p_create_sqltuning_task(‘g8hkhf0ma30vk‘);

This Tuning task name is :   TASK_18580

-------------Please using follow
command query SQL tuning report!------------

set linesize 200 pagesize 9999

set long 100000

select dbms_sqltune.report_tuning_task(‘TASK_18580‘) from dual;

PL/SQL procedure successfully completed.

二、查看产生的报告

SQLset linesize 200 pagesize 9999

SQLset long 100000

SQLselect dbms_sqltune.report_tuning_task(‘TASK_18580‘) from dual;

DBMS_SQLTUNE.REPORT_TUNING_TASK(‘TASK_18580‘)

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

GENERAL INFORMATION SECTION

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

Tuning Task Name   : TASK_18580

Tuning Task Owner  : SYS

Workload Type      : Single SQL Statement

Scope              : COMPREHENSIVE

Time Limit(seconds): 1800

Completion Status  : COMPLETED

Started at         : 06/10/2014 13:10:17

Completed at       : 06/10/2014 13:10:21

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

Schema Name: FLOW

SQL ID     : g8hkhf0ma30vk

SQL Text   : SELECT "IP","PR_URL","ACC_DATE","COOKIE" FROM "TB_FLOW" "F"

WHERE SUBSTR("PR_URL",INSTR("PR_URL",:"SYS_B_0"),:1)<>:"SYS_B_1"

AND TRUNC("ACC_DATE")=:2 AND "PR_URL" IS NOT NULL

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

FINDINGS SECTION (2 findings)

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

1- SQL Profile Finding (see explain plans section below)

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

A potentially better execution plan was found for this statement.

Recommendation (estimated benefit: 98.26%)

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

- Consider accepting the recommended SQL profile to use parallel execution

for this statement.

execute dbms_sqltune.accept_sql_profile(task_name => ‘TASK_18580‘,

task_owner => ‘SYS‘, replace => TRUE,
profile_type =>

DBMS_SQLTUNE.PX_PROFILE);

Executing this query parallel with DOP 64 will improve its response time

98.26% over the original plan. However, there is some cost in enabling

parallel execution. It will increase the statement‘s resource consumption by

an estimated 11.11% which may result in a reduction of system throughput.

Also, because these resources are consumed over a much smaller duration, the

response time of concurrent statements might be negatively impacted if

sufficient hardware capacity is not available.

The following data shows some sampled statistics for this SQL from the past

week and projected weekly values when parallel execution is enabled.

Past week sampled statistics for this SQL

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

Number of executions                                                   0

Percent of total activity                                              0

Percent of samples with #Active Sessions > 2*CPU                       0

Weekly DB time (in sec)                                                0

Projected statistics with Parallel Execution

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

Weekly DB time (in sec)                                                0

2- Restructure SQL finding (see plan 1 in explain plans section)

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

The predicate TRUNC("F"."ACC_DATE")=:B1 used at line ID 2 of the execution

plan contains an expression on indexed column "ACC_DATE". This  expression

prevents the optimizer from efficiently using indices on table

"FLOW"."TB_FLOW".

Recommendation

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

- Rewrite the predicate into an equivalent form to take advantage of

indices. Alternatively, create a function-based index on the expression.

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

EXPLAIN PLANS SECTION

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

1- Original

-----------

Plan hash value: 3675585382

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

----

| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

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

|   0 | SELECT STATEMENT    |         |  2381 |   253K|   312K  (0)|999:59:59 |

|       |

|   1 |  PARTITION RANGE ALL|         |  2381 |   253K|   312K  (0)|999:59:59 |     1 |    82 |

|*  2 |   TABLE ACCESS FULL | TB_FLOW |  2381 |   253K|   312K  (0)|999:59:59 |     1 |

82 |

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

Predicate Information (identified by operation id):

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

2 - filter("PR_URL" IS NOT NULL AND SUBSTR("PR_URL",INSTR("PR_URL",:SYS_B_0),:1)<>:S

YS_B_1 AND TRUNC(INTERNAL_FUNCTION("ACC_DATE"))=:2)

2- Using Parallel Execution

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

Plan hash value: 1016406201

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

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

| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ

|IN-OUT| PQ Distrib |

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

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

|   0 | SELECT STATEMENT     |          |  2381 |   253K|  5419   (0)| 40:42:45 |       |

|        |      |            |

|   1 |  PX COORDINATOR      |          |       |       |            |          |

|       |        |      |            |

|   2 |   PX SEND QC (RANDOM)| :TQ10000 |  2381 |   253K|  5419   (0)| 40:42:45 |       |       |  Q1,00 | P->S | QC

(RAND)  |

|   3 |    PX BLOCK ITERATOR |          |  2381 |   253K|  5419   (0)| 40:42:45 |     1 |    82 |  Q1,00 | PC

WC |            |

|*  4 |     TABLE ACCESS FULL| TB_FLOW  |  2381 |   253K|  5419   (0)| 40:42:45 |     1 |    82 |  Q1,

00 | PCWP |            |

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

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

Predicate Information (identified by operation id):

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

4 - filter("PR_URL" IS NOT NULL AND SUBSTR("PR_URL",INSTR("PR_URL",:SYS_B_0),:1)<>:SYS_B_1 AND

TRUNC(INTERNAL_FUNCTION("ACC_DATE"))=:2)

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

三、查看报告建议后,删除该报告

exec dbms_sqltune.drop_tuning_task(‘TASK_18580‘);

下一篇開始正式介绍SQL profile

SQL Profile 总结(一),布布扣,bubuko.com

时间: 2024-07-28 17:59:41

SQL Profile 总结(一)的相关文章

SQL Profile 如何使用

这些文章是我从<基于Oracle的SQL优化> 书中找到的 可以参考一下我的实验过程 SQL Profile Oracle10G中的SQL Profile可以说是Oracle 9i中的Stored Outline的进化. Stored Outline能够实现的功能SQL Profile也完全能够实现. 与Stored Outline相比,SQL Profile具备如下优点: 更容易生成.更改和控制. 在对SQL语句的支持上做得更好,也就是说适用范围更广. 使用SQL Profile可以容易实现

Oracle 通过sql profile为sql语句加hint

sql profile最大的优点是在不修改sql语句和会话执行环境的情况下去优化sql的执行效率,适合无法在应用程序中修改sql时.sql profile最常用方法大概是:--创建产生sql tuning advisor任务DECLARE  tuning_task varchar2(100);  l_sql_id    v$session.prev_sql_id%TYPE;BEGIN  l_sql_id    := '6w02d3ggsj4xb';  tuning_task := dbms_sq

Oracle固定SQL的执行计划(一)---SQL Profile

我们都希望对于所有在Oracle数据库中执行的SQL,CBO都能产生出正确的执行计划,但实际情况却并非如此,由于各种各样的原因(比如目标SQL所涉及的对象的统计信息的不准确,或者CBO内部一些成本计算公式的先天缺陷等),导致有时CBO产生效率不高.甚至是错误的执行计划.特别是CBO对目标SQL所产生的初始执行计划是正确的,后来由于某种原因(比如统计信息的变更等)而导致CBO重新对其产生了错误的执行计划,这种执行计划的改变往往会导致目标SQL执行时间呈数量级的递增,而且常常会让我们很困惑:这个SQ

通过案例学调优之--SQL Profile

通过案例学调优之--SQL Profile 一.什么是SQL Profile(概要) SQL Profile在性能优化中占有一个重要的位置. MOS里这么描述SQL Profile: SQL Profile是10g中的新特性,作为自动SQL调整过程的一部分,由Oracle企业管理器来管理.除了OEM,SQL Profile可以通过DBMS_SQLTUNE包来进行管理. 查询优化器有时候会因为缺乏足够的信息,而对一条SQL语句做出错误的估计,生成糟糕的执行计划.而自动SQL调整通过SQL概要分析来

SQL Profile 总结(四)--使用示例

前提:sql profile工具的相关视图 dba_sql_profile 10g: sys.sqlprof$attr  &  sqlprof$ 11g: sys.sqlobj$data  &  sys.sqlobj$ 1.主要完成四个示例,如下 使用dbms_sqltune.import_sql_profile过程手工指定提示的方式,这种方式要求非常高(查询块名等),一般不会使用 使用create_sql_profile.sql脚本固定内存中已经有的SQL的执行计划,通过指定sql_id

使用SQL Profile及SQL Tuning Advisor固定执行计划

SQL Profile就是为某一SQL语句提供除了系统统计信息.对象(表和索引等)统计信息之外的其他信息,比如运行环境.额外的更准确的统计信息,以帮助优化器为SQL语句选择更适合的执行计划. SQL Profiles可以说是Outlines的进化.Outlines能够实现的功能SQL Profiles也完全能够实现,而SQL Profiles具有Outlines不具备的优化,最重要的有二点: SQL Profiles更容易生成.更改和控制. SQL Profiles在对SQL语句的支持上做得更好

使用COE脚本绑定SQL Profile

日常运维中,经常会遇到需要绑定好的执行计划的场景. 简单来说,就是将一个sql_id绑定好的plan_hash_value.如果没有使用到绑定变量,还需要把froce_match设置为true. 用到的是MOS文档215187.1提供的系列脚本中的coe_xfr_sql_profile.sql. 下载地址:coe_xfr_sql_profile.sql.zip 脚本内容具体如下: SPO coe_xfr_sql_profile.log; SET DEF ON TERM OFF ECHO ON F

SQLT导入测试数据,及SQL Profile的使用

性能分析过程中,经常会遇到生产库出现SQL的性能问题,但是,我们没有办法在生产库上做很多动作,需要将这个SQL的对应的表结构信息,统计信息导入到测试库进行测试(没有真实的测试数据,只有统计信息) 本次测试目的,客户环境导出了Test和product环境的相同SQL的不同执行计划的SQLT报告. TEST环境是11.2.0.1版本 Product是11.2.0.2版本 我们会将两个SQLT报告分别导入到11.2.0.1和11.2.0.2的测试环境中,然后将11.2.0.1版本,好的执行计划,作为p

迷你sql profile,给缺少sql跟踪的朋友们

如果你的数据库没有sqlprofile,看这里. 如果你没时间装sqlserver那一系列的东西,看看这里,也许能解决呢. 这是一个迷你版的sqlprofile ,在win7下测试,链接sqlserver 2012没有问题. http://expressprofiler.codeplex.com/