设为首页 收藏本站
查看: 662|回复: 0

[经验分享] 通过案例学调优之--SQL Profile

[复制链接]

尚未签到

发表于 2018-10-23 12:52:51 | 显示全部楼层 |阅读模式
1、scott用户执行sql  
17:19:56 SCOTT@ prod >create table test (n number);
  
Table created.
  

  
17:20:16 SCOTT@ prod >begin
  
17:20:24   2  for i in 1..100000 loop
  
17:20:36   3  insert into test values (i);
  
17:20:47   4  commit;
  
17:20:49   5  end loop;
  
17:20:52   6  end;
  
17:20:53   7  /
  
PL/SQL procedure successfully completed.
  

  
17:22:02 SCOTT@ prod >create index test_ind on test(n);
  
Index created.
  

  
17:22:55 SCOTT@ prod >exec dbms_stats.gather_table_stats(user,'TEST' ,cascade=>true);
  
PL/SQL procedure successfully completed.
  

  
17:23:15 SCOTT@ prod >set autotrace on
  
17:23:43 SCOTT@ prod >select * from test where n=100;
  
         N
  
----------
  
       100
  
Elapsed: 00:00:00.01
  
Execution Plan
  
----------------------------------------------------------
  
Plan hash value: 3357096749
  
-----------------------------------------------------------------------------
  
| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  
-----------------------------------------------------------------------------
  
|   0 | SELECT STATEMENT |          |     1 |     5 |     1   (0)| 00:00:01 |
  
|*  1 |  INDEX RANGE SCAN| TEST_IND |     1 |     5 |     1   (0)| 00:00:01 |
  
-----------------------------------------------------------------------------
  
Predicate Information (identified by operation id):
  
---------------------------------------------------
  
   1 - access("N"=100)
  
Statistics
  
----------------------------------------------------------
  
          1  recursive calls
  
          0  db block gets
  
          3  consistent gets
  
          0  physical reads
  
          0  redo size
  
        415  bytes sent via SQL*Net to client
  
        419  bytes received via SQL*Net from client
  
          2  SQL*Net roundtrips to/from client
  
          0  sorts (memory)
  
          0  sorts (disk)
  
          1  rows processed
  

  
对此sql建立sql profile:
  
17:24:02 SCOTT@ prod >select /*+ no_index(test,test_ind) */ * from test where n=100;
  
         N
  
----------
  
       100
  
Elapsed: 00:00:00.01
  
Execution Plan
  
----------------------------------------------------------
  
Plan hash value: 1357081020
  
--------------------------------------------------------------------------
  
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
  
--------------------------------------------------------------------------
  
|   0 | SELECT STATEMENT  |      |     1 |     5 |    69   (2)| 00:00:01 |
  
|*  1 |  TABLE ACCESS FULL| TEST |     1 |     5 |    69   (2)| 00:00:01 |
  
--------------------------------------------------------------------------
  
Predicate Information (identified by operation id):
  
---------------------------------------------------
  
   1 - filter("N"=100)
  
Statistics
  
----------------------------------------------------------
  
          1  recursive calls
  
          0  db block gets
  
        191  consistent gets
  
          0  physical reads
  
          0  redo size
  
        415  bytes sent via SQL*Net to client
  
        419  bytes received via SQL*Net from client
  
          2  SQL*Net roundtrips to/from client
  
          0  sorts (memory)
  
          0  sorts (disk)
  
          1  rows processed
  

  
2、通过sys用户建立sql profile(使用dbms_sqltune包)
  
17:28:26 SYS@ prod >declare
  
17:29:34   2
  
17:29:34   3    my_task_name VARCHAR2(30);
  
17:29:34   4
  
17:29:34   5    my_sqltext CLOB;
  
17:29:34   6
  
17:29:34   7    begin
  
17:29:34   8
  
17:29:34   9       my_sqltext := 'select /*+ no_index(test test_ind) */ * from test where n=100';
  
17:29:34  10
  
17:29:34  11       my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
  
17:29:34  12
  
17:29:34  13       sql_text => my_sqltext,
  
17:29:34  14
  
17:29:34  15       user_name => 'SCOTT',
  
17:29:34  16
  
17:29:34  17       scope => 'COMPREHENSIVE',
  
17:29:34  18
  
17:29:34  19       time_limit => 60,
  
17:29:34  20
  
17:29:34  21       task_name => 'my_tun1',
  
17:29:34  22
  
17:29:34  23       description => 'Task to tune a query on a specified table');
  
17:29:34  24
  
17:29:34  25  end;
  
17:29:35  26  /
  
PL/SQL procedure successfully completed.
  

  
建立调优任务:
  
17:29:37 SYS@ prod >begin
  
17:30:39   2
  
17:30:39   3  DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'my_tun1');
  
17:30:39   4
  
17:30:39   5  end;
  
17:30:39   6
  
17:30:39   7  /
  
PL/SQL procedure successfully completed.
  

  
查看调优task:
  
17:32:47 SYS@ prod >set long 1000
  
17:33:17 SYS@ prod >set longchunksize 1000
  
17:33:24 SYS@ prod >set linesize 100
  
17:33:32 SYS@ prod >SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('my_tun1') from dual
  
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_TUN1')
  
----------------------------------------------------------------------------------------------------
  
GENERAL INFORMATION SECTION
  
-------------------------------------------------------------------------------
  
Tuning Task Name   : my_tun1
  
Tuning Task Owner  : SYS
  
Workload Type      : Single SQL Statement
  
Scope              : COMPREHENSIVE
  
Time Limit(seconds): 60
  
Completion Status  : COMPLETED
  
Started at         : 11/07/2014 17:30:41
  
Completed at       : 11/07/2014 17:30:49
  
-------------------------------------------------------------------------------
  
Schema Name: SCOTT
  
SQL ID     : b1wdr0b0qzsbg
  
SQL Text   : select /*+ no_index(test test_ind) */ * from test where n=100
  
-------------------------------------------------------------------------------
  
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_TUN1')
  
----------------------------------------------------------------------------------------------------
  
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: 99.41%)
  

  
17:34:58 SYS@ prod >execute dbms_sqltune.accept_sql_profile(task_name =>'my_tun1',task_owner => 'SYS', replace => TRUE);
  
PL/SQL procedure successfully completed.
  

  
建立sql profile:
  
17:39:22 SYS@ prod >DECLARE
  
17:41:13   2
  
17:41:13   3  my_sqlprofile_name VARCHAR2(30);
  
17:41:13   4
  
17:41:13   5  begin
  
17:41:13   6
  
17:41:13   7  my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
  
17:41:13   8
  
17:41:13   9  task_name => 'my_tun1',
  
17:41:13  10
  
17:41:13  11  name => 'my_sqlprofile',force_match=>false);
  
17:41:13  12
  
17:41:13  13  end;
  
17:41:15  14  /
  
DECLARE
  
*
  
ERROR at line 1:
  
ORA-13830: SQL profile with category DEFAULT already exists for this SQL statement
  
ORA-06512: at "SYS.DBMS_SQLTUNE_INTERNAL", line 16259
  
ORA-06512: at "SYS.PRVT_SQLPROF_INFRA", line 31
  
ORA-06512: at "SYS.DBMS_SQLTUNE", line 7133
  
ORA-06512: at line 7
  

  
17:44:28 SYS@ prod >DECLARE
  
17:46:00   2
  
17:46:00   3  my_sqlprofile_name VARCHAR2(30);
  
17:46:00   4
  
17:46:00   5  begin
  
17:46:00   6
  
17:46:00   7  my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
  
17:46:00   8
  
17:46:00   9  task_name => 'my_tun1',
  
17:46:00  10
  
17:46:00  11  name => 'my_sqlprofile',force_match=>false,CATEGORY=>'scott');
  
17:46:00  12
  
17:46:00  13  end;
  
17:46:01  14  /
  
PL/SQL procedure successfully completed.
  

  
17:53:49 SYS@ prod >select name, CATEGORY,sql_text,status from dba_sql_profiles;
  
NAME                           CATEGORY
  
------------------------------ ------------------------------
  
SQL_TEXT
  
----------------------------------------------------------------------------------------------------
  
STATUS
  
--------
  
SYS_SQLPROF_0149899c759a0000   DEFAULT
  
select /*+ no_index(test test_ind) */ * from test where n=100
  
ENABLED
  
my_sqlprofile                  SCOTT
  
select /*+ no_index(test test_ind) */ * from test where n=100
  
ENABLED
  

  
删除存在的sql profile:
  
17:53:51 SYS@ prod >exec DBMS_SQLTUNE.DROP_SQL_PROFILE(name =>'SYS_SQLPROF_0149899c759a0000');
  
PL/SQL procedure successfully completed.
  

  
17:55:20 SYS@ prod >exec DBMS_SQLTUNE.DROP_SQL_PROFILE(name =>'my_sqlprofile');
  
PL/SQL procedure successfully completed.
  

  
重新建立sql profile:
  
17:55:35 SYS@ prod >DECLARE
  
17:56:13   2
  
17:56:13   3  my_sqlprofile_name VARCHAR2(30);
  
17:56:13   4
  
17:56:13   5  begin
  
17:56:13   6
  
17:56:13   7  my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
  
17:56:13   8
  
17:56:13   9  task_name => 'my_tun1',
  
17:56:13  10
  
17:56:13  11  name => 'my_sqlprofile');
  
17:56:13  12
  
17:56:13  13  end;
  
17:56:16  14  /
  
PL/SQL procedure successfully completed.
  
Elapsed: 00:00:00.04
  

  
查看sql profile:
  
18:01:48 SYS@ prod >col name for a20
  
18:01:55 SYS@ prod >r
  
  1* select name,CATEGORY,SQL_TEXT,TASK_EXEC_NAME ,STATUS from dba_sql_profiles
  
NAME                 CATEGORY   SQL_TEXT
  
-------------------- ---------- --------------------------------------------------
  
TASK_EXEC_NAME                 STATUS
  
------------------------------ --------
  
my_sqlprofile        DEFAULT    select /*+ no_index(test test_ind) */ * from test
  
                                where n=100
  
EXEC_427                       ENABLED
  

  
3、以scott用户的身份进行验证
  
18:01:55 SYS@ prod >conn scott/tiger
  
Connected.
  
18:02:43 SCOTT@ prod >set autotrace on
  
18:02:46 SCOTT@ prod > select /*+ no_index(test test_ind) */ * from test where n=100;
  
         N
  
----------
  
       100
  
Elapsed: 00:00:00.05
  
Execution Plan
  
----------------------------------------------------------
  
Plan hash value: 3357096749
  
-----------------------------------------------------------------------------
  
| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  
-----------------------------------------------------------------------------
  
|   0 | SELECT STATEMENT |          |     1 |     5 |     1   (0)| 00:00:01 |
  
|*  1 |  INDEX RANGE SCAN| TEST_IND |     1 |     5 |     1   (0)| 00:00:01 |
  
-----------------------------------------------------------------------------
  
Predicate Information (identified by operation id):
  
---------------------------------------------------
  
   1 - access("N"=100)
  
Note
  
-----
  
   - SQL profile "my_sqlprofile" used for this statement
  
Statistics
  
----------------------------------------------------------
  
        790  recursive calls
  
          0  db block gets
  
        168  consistent gets
  
          6  physical reads
  
        116  redo size
  
        415  bytes sent via SQL*Net to client
  
        419  bytes received via SQL*Net from client
  
          2  SQL*Net roundtrips to/from client
  
         13  sorts (memory)
  
          0  sorts (disk)
  
          1  rows processed



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625485-1-1.html 上篇帖子: Linux下开启/关闭MySql Server命令 下篇帖子: SharePoint Server 2013 之一:为SharePoint启航
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表