当前位置:  数据库>oracle

Oracle SQL Profile

    来源: 互联网  发布时间:2017-05-11

    本文导语: 本篇文章来简单看下如何使用sql profile来绑定正确的执行计划,10gR2出现这个功能还是蛮实用的,当然11g可以使用baseline, 当然我觉得这两种都挺好。 我们可能经常会遇到一些大表比如上T的,走错执行计划,比如全表扫描,那系...

本篇文章来简单看下如何使用sql profile来绑定正确的执行计划,10gR2出现这个功能还是蛮实用的,当然11g可以使用baseline,

当然我觉得这两种都挺好。

我们可能经常会遇到一些大表比如上T的,走错执行计划,比如全表扫描,那系统基本处于Hang的状态,那么这时候收集统计信息可能会很慢,即使你采样的比例设置的很小。所以使用profile和baseline是个不错的选择。

一,创建测试环境

SQL> create table test (n number ); 
Table created. 
 
declare 
begin 
for i in 1 .. 10000 
loop 
insert into test values(i); 
commit; 
end loop; 
end; 

PL/SQL procedure successfully completed. 
 
create index test_idx on test(n); 
Index created. 
 
SQL> exec dbms_stats.gather_table_stats('LEO','TEST'); 
PL/SQL procedure successfully completed. 

二,测试sql

var v varchar2(5); 
exec :v :=1; 
set autotrace on 
SQL> select /*+ no_index(test test_idx) */ * from test where n=:v; 
        N 
---------- 
        1 
Execution Plan 
---------------------------------------------------------- 
Plan hash value: 1357081020 
-------------------------------------------------------------------------- 
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time    | 
-------------------------------------------------------------------------- 
|  0 | SELECT STATEMENT  |      |    1 |    4 |    7  (0)| 00:00:01 | 
|*  1 |  TABLE ACCESS FULL| TEST |    1 |    4 |    7  (0)| 00:00:01 | 
-------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
  1 - filter("N"=TO_NUMBER(:V)) 
Statistics 
---------------------------------------------------------- 
          5  recursive calls 
          0  db block gets 
        25  consistent gets 
          0  physical reads 
          0  redo size 
        415  bytes sent via SQL*Net to client 
        415  bytes received via SQL*Net from client 
          2  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
          1  rows processed 

三,使用profile来固定和优化sql
当然如上是全表扫描,很显然不是最优的,下面使用profile来固定和优化sql

1.Create tuning task

SQL> declare 
  2    my_task_name VARCHAR2(30); 
  3    my_sqltext CLOB; 
  4    begin 
  5        my_sqltext := 'select /*+ no_index(test test_idx) */ * from test where n=:v'; 
  6      my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK( 
  7      sql_text => my_sqltext, 
  8      user_name => 'LEO',--Username for whom the statement is to be tuned 
  9        scope => 'COMPREHENSIVE', 
 10        time_limit => 60, 
 11      task_name => 'my_sql_tuning_task_5', 
 12      description => 'Task to tune a query on a specified table'); 
 13  end; 
 14  / 
PL/SQL procedure successfully completed. 

/*+如上是使用sql text,实际环境中还是使用sql_id,还是更方便点,下面看如何使用sql_id*/

  • select sql_id from v$sql where upper(sql_text) like upper('%select /*+ no_index(test test_idx)%');
  • sql_id
  • ------
  • brg4wn3kfzp34
  • SQL> declare
  • 2 my_task_name VARCHAR2(30);
  • 3 my_sqltext CLOB;
  • 4 my_sqlid varchar2(50);
  • 5 my_plan_hash_value varchar2(50);
  • 6 begin
  • 7 my_sqlid := 'brg4wn3kfzp34';--如上SQL的sql_id
  • 8 my_plan_hash_value :='1357081020';--如上sql的hash_value
  • 9 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
  • 10 sql_id => my_sqlid,
  • 11 plan_hash_value =>my_plan_hash_value,
  • 12 scope => 'COMPREHENSIVE',
  • 13 time_limit => 60,
  • 14 task_name => 'my_sql_tuning_task_5',
  • 15 description => 'Task to tune a query on a specified table');
  • 16 end;
  • 17 /
  • 2.execute tuning task

    SQL> begin 
      2  DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'my_sql_tuning_task_5'); 
      3  end; 
      4 / 
    PL/SQL procedure successfully completed. 

    3.report tuning task

    SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'my_sql_tuning_task_5') from DUAL; 
    GENERAL INFORMATION SECTION 
    ------------------------------------------------------------------------------- 
    Tuning Task Name  : my_sql_tuning_task_5 
    Tuning Task Owner  : SYS 
    Workload Type      : Single SQL Statement 
    Execution Count    : 2 
    Current Execution  : EXEC_91 
    Execution Type    : TUNE SQL 
    Scope              : COMPREHENSIVE 
    Time Limit(seconds): 60 
    Completion Status  : COMPLETED 
    Started at        : 07/19/2012 20:45:42 
    Completed at      : 07/19/2012 20:45:43 
    ------------------------------------------------------------------------------- 
    Schema Name: LEO 
    SQL ID    : brg4wn3kfzp34 
    SQL Text  : select /*+ no_index(test test_idx) */ * from test where n=:v 
    ------------------------------------------------------------------------------- 
    FINDINGS SECTION (1 finding) 
    ------------------------------------------------------------------------------- 
    1- SQL Profile Finding (see explain plans section below) 
    -------------------------------------------------------- 
      A potentially better execution plan was found for this statement. 
      Recommendation (estimated benefit: 95.02%) 
      ------------------------------------------ 
      - Consider accepting the recommended SQL profile. 
        execute dbms_sqltune.accept_sql_profile(task_name => 
                'my_sql_tuning_task_5', task_owner => 'SYS', replace => TRUE); 
      Validation results 
      ------------------ 
      The SQL profile was tested by executing both its plan and the original plan 
      and measuring their respective execution statistics. A plan may have been 
      only partially executed if the other could be run to completion in less time. 
                              Original Plan  With SQL Profile  % Improved 
                              -------------  ----------------  ---------- 
      Completion Status:            COMPLETE          COMPLETE 
      Elapsed Time(us):                642              168      73.83 % 
      CPU Time(us):                    1200                0        100 % 
      User I/O Time(us):                  0                0 
      Buffer Gets:                      20                1        95 % 
      Physical Read Requests:            0                0 
      Physical Write Requests:            0                0 
      Physical Read Bytes:                0                0 
      Physical Write Bytes:              0                0 
      Rows Processed:                    1                1 
      Fetches:                            1                1 
      Executions:                        1                1 
      Notes 
      ----- 
      1. The original plan was first executed to warm the buffer cache. 
      2. Statistics for original plan were averaged over next 9 executions. 
      3. The SQL profile plan was first executed to warm the buffer cache. 
      4. Statistics for the SQL profile plan were averaged over next 9 executions. 
    ------------------------------------------------------------------------------- 
    EXPLAIN PLANS SECTION 
    ------------------------------------------------------------------------------- 
     
    1- Original With Adjusted Cost 
    ------------------------------ 
    Plan hash value: 1357081020 
    -------------------------------------------------------------------------- 
    | Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time    | 
    -------------------------------------------------------------------------- 
    |  0 | SELECT STATEMENT  |      |    1 |    4 |    7  (0)| 00:00:01 | 
    |*  1 |  TABLE ACCESS FULL| TEST |    1 |    4 |    7  (0)| 00:00:01 | 
    -------------------------------------------------------------------------- 
    Predicate Information (identified by operation id): 
    --------------------------------------------------- 
      1 - filter("N"=TO_NUMBER(:V)) 
     
    2- Using SQL Profile 
    -------------------- 
    Plan hash value: 2882402178 
    ----------------------------------------------------------------------------- 
    | Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time    | 
    ----------------------------------------------------------------------------- 
    |  0 | SELECT STATEMENT |          |    1 |    4 |    1  (0)| 00:00:01 | 
    |*  1 |  INDEX RANGE SCAN| TEST_IDX |    1 |    4 |    1  (0)| 00:00:01 | 
    ----------------------------------------------------------------------------- 
    Predicate Information (identified by operation id): 
    --------------------------------------------------- 
      1 - access("N"=TO_NUMBER(:V)) 
    ------------------------------------------------------------------------------- 

    可以看到如上信息,下面我们acctpt此profile:


        
     
     

    您可能感兴趣的文章:

  • 修改oracle用户的.bash_profile之后无法正常登陆
  • 怎样知道一个用户的主目录,也就是.bash_profile所在的目录?如/home/oracle
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?
  • linux6.0下安装oracle11g, 新建用户后,在用户目录下为什么没有.bash_profile文件生成? 求教高手。谢谢!
  • 求.bash_profile配置oracle详解
  • linux下安装Oracle 10g /etc/profile 出现 -bash: ulimit: pipe size :cannot modify limit:invalid argument 的错误
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle 数据库开发工具 Oracle SQL Developer
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 取数据库前几条数据(sql server、oracle、mysql)的sql写法
  • Oracle发布Oracle SQL Developer 1.2数据库开发工具 帮助用户简化开发工作
  • oracle用什么SQL语句判断表存不存在
  • 与jsp搭配,oracle好?sql server好?
  • Oracle开发工具 Oracle SQL Handler
  • Oracle与SQL Server区别在哪里
  • oracle sql执行过程(流程图)
  • Oracle的SQL语句中如何处理‘&’符号
  • oracle中得到一条SQL语句的执行时间的两种方式
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • Oracle捕获问题SQL解决CPU过渡消耗
  • Oracle中SQL语句连接字符串的符号使用介绍
  • Unix系统下oracle sql排版
  • oracle.xml.sql.query.OracleXMLQuery
  • oracle SQL解析步骤小结
  • 怎么在java中向一个sql语句传参数,就像oracle的proc一样啊?
  • Oracle中DBMS_SQL解析SQL语句的流程
  • Linux/UNIX下,C++程序通过那些步骤访问Oracle或者Sybase SQL数据库?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??
  • ORACLE中DBMS_RANDOM随机数生成包
  • 在linux 中如何删除oracle db 与卸载oracle.


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,