sql profile

简介:

1、准备测试数据

create table hy19 as select * from dba_objects;

 

2、创建索引并分析

 

CREATE INDEX INX_19 ON SCOTT.HY19(OBJECT_ID);

ANALYZE TABLE SCOTT.HY19 COMPUTE STATISTICS;

 

 

3. 执行SQL语句,模拟一个性能低下的执行计划

SELECT /*+ no_index(HY19 INX_19)*/ * FROM HY19  WHERE OBJECT_ID=1;

(此处用别名访问表时发现hint不起作用)

SQL> SELECT /*+ no_index(HY19 INX_19)*/ * FROM HY19  WHERE OBJECT_ID=1;

 

 

Execution Plan

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

Plan hash value: 3188441247

 

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

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

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

|   0 | SELECT STATEMENT  |      |     1 |    87 |   159   (2)| 00:00:02 |

|*  1 |  TABLE ACCESS FULL| HY19 |     1 |    87 |   159   (2)| 00:00:02 |

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

 

Predicate Information (identified by operation id):

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

 

   1 - filter("OBJECT_ID"=1)

 

4、创建优化任务:

–使用SQL TEXT

 

DECLARE

  my_task_name VARCHAR2(30);

  my_sqltext   CLOB;

BEGIN

  my_sqltext := 'SELECT /*+ no_index(HY19 INX_19)*/ * FROM HY19  WHERE OBJECT_ID=1';

  my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(

         sql_text    => my_sqltext,

         user_name   => 'SCOTT',

         scope       => 'COMPREHENSIVE',

         time_limit  => 60,

         task_name   => 'tuning_task_1',

         description => 'Task to tune a query on a specified table');

END;

/

–使用SQL ID:

DECLARE

 my_task_name VARCHAR2(50);

 my_sql_id   VARCHAR2(64);

BEGIN

 my_sql_id := 'gh991ctttx3k7';

 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(

         sql_id    => my_sql_id,

         scope       => 'COMPREHENSIVE',

         time_limit  => 60,

         task_name   => 'rockey_sql_tuning_task_001',

         description => 'Task to tune a query on a specified table');

END;

 

/

5、执行优化任务:

BEGIN

  DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'rockey_sql_tuning_task_001');

end;

/

 

6、查看优化建议:

SET WRAP ON

SET LONG 10000

SET LONGCHUNKSIZE 1000

SET LINESIZE 130

SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'rockey_sql_tuning_task_001') from DUAL;

或者

SELECT dbms_advisor.GET_TASK_REPORT(task_name)

  FROM dba_advisor_tasks

 where task_name = 'rockey_sql_tuning_task_001';

 

7、SQL语句绑字SQL Profile:

begin

  dbms_sqltune.accept_sql_profile(task_name   => 'rockey_sql_tuning_task_001',

                                  name        => 'my_sql_profile_001');

end;

/

 

8. 再次执行相同的语句,验证结果

SQL> SELECT /*+ no_index(HY19 INX_19)*/ * FROM HY19  WHERE OBJECT_ID=1;

Execution Plan

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

Plan hash value: 2066044106

 

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

 

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

     |

 

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

 

|   0 | SELECT STATEMENT            |        |     1 |    87 |     2   (0)| 00:00:01 |

 

|   1 |  TABLE ACCESS BY INDEX ROWID| HY19   |     1 |    87 |     2   (0)| 00:00:01 |

 

|*  2 |   INDEX RANGE SCAN          | INX_19 |     1 |       |     1   (0)| 00:00:01 |

 

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

 

 

Predicate Information (identified by operation id):

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

 

   2 - access("OBJECT_ID"=1)

这里可以看出,Oracle已经使用了不同的执行计划

 

9、查看语句是否使用了SQL Profile:

select sql_text, sql_id, sql_profile, executions, plan_hash_value

  from v$sql

 where sql_profile is not null;

 

10、其它常用功能:

删除优化任务:

begin

dbms_sqltune.drop_tuning_task('rockey_sql_tuning_task_001');

end;

/

 

begin

dbms_advisor.delete_task('rockey_sql_tuning_task_001');

end;

/

删除SQL Profile:

BEGIN

  DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'my_sql_profile_001');

END;

/

与优化任务相关的常用视图:

select * from dba_sql_profiles;

 

select * from DBA_ADVISOR_TASKS;

############

SQL Profiles可以看作是SQL语句的统计信息。只是这个统计信息对特定SQL语句才能起作用,不对会语句的对象、其它语句产生影响。

使用SQL Profiles前要用SQL Tuning Advisor收集对语句的优化建议,再根据优化建议创建SQL Profiles。

SQL Profiles 使用也比较灵活,可以在会话级、系统级应用。

语句绑定SQL Profile后,测试了下SQL Profile与Bind Peeking的关系。测试发现,Bind Peeking的特性还是会起作用。这从另一方面说明SQL Profile与OUTLINE的不同:绑定OUTLINE后,执行计划是被固化的;绑定SQL Profile后,执行计划不是不变,而是优化器在执行该语句时,会参考SQL Profile中的信息。

############





本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/747014,如需转载请自行联系原作者
目录
相关文章
|
SQL 存储 监控
【MySQL从入门到精通】【高级篇】(二十二)慢查询日志分析,SHOW PROFILE查看SQL执行成本
上一篇文章我们介绍数据库的优化步骤【MySQL从入门到精通】【高级篇】(二十一)数据库优化步骤_查看系统性能参数,其中,说到了通过开启慢查询日志来分析慢查询的SQL。这篇文章就是具体来介绍如何开启慢查询日志以及如何分析慢查询日志。
214 0
【MySQL从入门到精通】【高级篇】(二十二)慢查询日志分析,SHOW PROFILE查看SQL执行成本
|
SQL 存储 监控
Mysql中 慢查询日志和show profile进行sql分析
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
337 0
|
SQL 关系型数据库 MySQL
几个必须掌握的SQL优化技巧(五):Show Profile分析SQL性能
在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。
189 0
几个必须掌握的SQL优化技巧(五):Show Profile分析SQL性能
|
SQL 存储 算法
MySQL数据库性能优化由浅入深(表设计、慢查询、SQL索引优化、Explain分析、Show Profile分析、配置优化)
通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解
286 0
MySQL数据库性能优化由浅入深(表设计、慢查询、SQL索引优化、Explain分析、Show Profile分析、配置优化)
|
SQL 索引 Perl
[20180302]sql profile能减少分析时间吗?
[20180302]sql profile能减少分析时间吗? --//链接http://www.itpub.net/thread-2097379-1-1.html的讨论,测试看看sql profile能减少分析时间吗? --//要找到这样的语句分析时间"很长",...
876 0
|
SQL
[20180301]sql profile 非绑定变量.txt
[20180301]sql profile 非绑定变量.txt http://www.itpub.net/thread-2097379-1-1.html 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING            ...
830 0