[20130626]11GR2 SQL Tuning Advisor.txt

简介: [20130626]11GR2 SQL Tuning Advisor.txt11GR2加入了sql tuning advisor,缺省是打开的,我发现一些dba建议安装11G后,直接关闭它,好像因为消耗资源.
[20130626]11GR2 SQL Tuning Advisor.txt

11GR2加入了sql tuning advisor,缺省是打开的,我发现一些dba建议安装11G后,直接关闭它,好像因为消耗资源.

SQL> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

BEGIN
  DBMS_AUTO_TASK_ADMIN.disable(
    client_name => 'sql tuning advisor',
    operation   => NULL,
    window_name => NULL);
END;
/

实际上,如果能看看里面信息,对于优化还是有许多帮助的.

SQL> select client_name, status,attributes,service_name from dba_autotask_client;
CLIENT_NAME                              STATUS   ATTRIBUTES                                                   SERVICE_NAME
---------------------------------------- -------- ------------------------------------------------------------ --------------
auto optimizer stats collection          ENABLED  ON BY DEFAULT, VOLATILE, SAFE TO KILL
auto space advisor                       ENABLED  ON BY DEFAULT, VOLATILE, SAFE TO KILL
sql tuning advisor                       ENABLED  ONCE PER WINDOW, ON BY DEFAULT, VOLATILE, SAFE TO KILL

select * from dba_advisor_findings  where task_name like 'SYS_AUTO_SQL_TUNING_TASK';

--可以获得信息.

--如果想知道如何建议,执行如下:

--我喜欢显示信息是英文的,定义环境变量NLS_LANG=AMERICAN_AMERICA.ZHS16GBK.

spool suggest.txt
select dbms_sqltune.report_auto_tuning_task(
  (select min(execution_name) from dba_advisor_findings
    where task_name like 'SYS_AUTO_SQL_TUNING_TASK'),
  (select max(execution_name) from dba_advisor_findings
    where task_name like 'SYS_AUTO_SQL_TUNING_TASK')
) from dual;
spool off

--抽取一段里面的信息,我看到都是访问系统表的一些信息:

-------------------------------------------------------------------------------
      SQLs with SQL Profile Findings Ordered by Maximum Benefit, Object ID
-------------------------------------------------------------------------------
execution name                 object ID  SQL ID        benefit
------------------------------ ---------- ------------- --------
EXEC_10224                           6517 fpf9ztf0yw0fw   96.91%
EXEC_10177                           6462 g10n36gghz1rr   93.80%
EXEC_10177                           6465 cbmzd29dvsx8j   92.21%
EXEC_10177                           6479 7ptuqb2nxxzrv   92.02%
EXEC_10177                           6456 1s3w0r29yv8cv   90.92%
EXEC_10112                           6437 d0cdpbm2v4ubu   89.95%
EXEC_10177                           6466 2m5atu0grvtmq   84.04%
EXEC_10112                           6442 0kyb2cb1ra5aq   84.02%
EXEC_10177                           6469 c9fckvj9d4muu   82.77%
EXEC_10112                           6439 72yf8srrpkwmh   80.15%
....

-------------------------------------------------------------------------------
 Statements with Results Ordered by Maximum (Profile/Index) Benefit, Object ID
-------------------------------------------------------------------------------
Object ID  : 6465
Schema Name: SCOTT
SQL ID     : cbmzd29dvsx8j
SQL Text   : SELECT u.NAME FROM sys.USER$ u WHERE  u.TYPE# = 1 AND    EXISTS
             (SELECT owner#                FROM sys.obj$ o
             WHERE o.OWNER# = u.USER#                AND (o.TYPE# 5)
                      AND NOT ((o.TYPE# = 2) AND (BITAND(o.flags, 2) = 2))
                         AND NOT ((o.TYPE# = 1) AND (BITAND(o.flags, 2) =
             2))) ORDER BY 1

-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------

1- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------
  A potentially better execution plan was found for this statement.
  The SQL profile was not automatically created because auto-creation was
  disabled.  Set task parameter ACCEPT_SQL_PROFILES to TRUE to enable
  auto-creation.

  Recommendation (estimated benefit: 92.21%)
  ------------------------------------------
  - Consider accepting the recommended SQL profile.
    execute dbms_sqltune.accept_sql_profile(task_name =>
            'SYS_AUTO_SQL_TUNING_TASK', object_id => 6465, 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 (s):             .065773           .000795      98.79 %
  CPU Time (s):                  .06569           .000799      98.78 %
  User I/O Time (s):            .000178                 0        100 %
  Buffer Gets:                     1973               154      92.19 %
  Physical Read Requests:            10                 0        100 %
  Physical Write Requests:            0                 0
  Physical Read Bytes:            82739                 0        100 %
  Physical Write Bytes:               0                 0
  Rows Processed:                    28                28
  Fetches:                           28                28
  Executions:                         1                 1

  Notes
  -----
  1. Statistics for the original plan were averaged over 10 executions.
  2. Statistics for the SQL profile plan were averaged over 10 executions.
--也许是这些消耗资源!!要做10次以上.试想如果语句本来就很慢,再这样做有点可怕!
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original With Adjusted Cost
------------------------------
Plan hash value: 977673319

------------------------------------------------------------------------------------------
| Id  | Operation                      | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |         |     2 |    40 |     6  (17)| 00:00:01 |
|   1 |  SORT ORDER BY                 |         |     2 |    40 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID  | USER$   |     2 |    40 |     2   (0)| 00:00:01 |
|*  3 |    INDEX SKIP SCAN             | I_USER2 |     2 |       |     1   (0)| 00:00:01 |
|*  4 |     TABLE ACCESS BY INDEX ROWID| OBJ$    |     1 |    10 |     3   (0)| 00:00:01 |
|*  5 |      INDEX SKIP SCAN           | I_OBJ4  |  1518 |       |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("U"."TYPE#"=1)
       filter("U"."TYPE#"=1 AND  EXISTS (SELECT /*+ PUSH_SUBQ INDEX_SS ("O"
              "I_OBJ4") */ 0 FROM "SYS"."OBJ$" "O" WHERE ("O"."TYPE#"1 OR
              BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2 OR BITAND("O"."FLAGS",2)2) AND
              "O"."OWNER#"=:B1 AND "O"."TYPE#"5))
   4 - filter(("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2 OR
              BITAND("O"."FLAGS",2)2))
   5 - access("O"."OWNER#"=:B1)
       filter("O"."OWNER#"=:B1 AND "O"."TYPE#"5)

2- Using SQL Profile
--------------------
Plan hash value: 2080390714

----------------------------------------------------------------------------------------
| Id  | Operation                     | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |        |     1 |    20 |    82   (2)| 00:00:01 |
|   1 |  SORT ORDER BY                |        |     1 |    20 |    82   (2)| 00:00:01 |
|*  2 |   FILTER                      |        |       |       |            |          |
|*  3 |    TABLE ACCESS FULL          | USER$  |    39 |   780 |     4   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS BY INDEX ROWID| OBJ$   |     1 |    10 |     4   (0)| 00:00:01 |
|*  5 |     INDEX RANGE SCAN          | I_OBJ2 |       |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter( EXISTS (SELECT 0 FROM "SYS"."OBJ$" "O" WHERE "O"."OWNER#"=:B1
              AND ("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2 OR
              BITAND("O"."FLAGS",2)2) AND "O"."TYPE#"5))
   3 - filter("U"."TYPE#"=1)
   4 - filter(("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2
              OR BITAND("O"."FLAGS",2)2))
   5 - access("O"."OWNER#"=:B1)
       filter("O"."TYPE#"5)


3.拿上面的例子做一个测试:
SQL> set autot traceonly ;
SELECT u.NAME FROM sys.USER$ u WHERE  u.TYPE# = 1 AND    EXISTS
             (SELECT owner#                FROM sys.obj$ o
             WHERE o.OWNER# = u.USER#                AND (o.TYPE#  5)
                      AND NOT ((o.TYPE# = 2) AND (BITAND(o.flags, 2) = 2))
                         AND NOT ((o.TYPE# = 1) AND (BITAND(o.flags, 2) =
                2))) ORDER BY 1;

28 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 977673319

------------------------------------------------------------------------------------------
| Id  | Operation                      | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |         |     1 |    20 |    61   (2)| 00:00:01 |
|   1 |  SORT ORDER BY                 |         |     1 |    20 |    61   (2)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID  | USER$   |     2 |    40 |     2   (0)| 00:00:01 |
|*  3 |    INDEX SKIP SCAN             | I_USER2 |     2 |       |     1   (0)| 00:00:01 |
|*  4 |     TABLE ACCESS BY INDEX ROWID| OBJ$    |     1 |    10 |     3   (0)| 00:00:01 |
|*  5 |      INDEX SKIP SCAN           | I_OBJ4  |       |       |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("U"."TYPE#"=1)
       filter("U"."TYPE#"=1 AND  EXISTS (SELECT 0 FROM "SYS"."OBJ$" "O" WHERE
              ("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2 OR
              BITAND("O"."FLAGS",2)2) AND "O"."OWNER#"=:B1 AND "O"."TYPE#"5))
   4 - filter(("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2 OR
              BITAND("O"."FLAGS",2)2))
   5 - access("O"."OWNER#"=:B1)
       filter("O"."OWNER#"=:B1 AND "O"."TYPE#"5)

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       2062  consistent gets
          0  physical reads
          0  redo size
        883  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         28  rows processed
---逻辑读2062.

按照建议执行如下:
execute dbms_sqltune.accept_sql_profile(task_name =>'SYS_AUTO_SQL_TUNING_TASK', object_id => 6465, task_owner =>'SYS', replace => TRUE);

Execution Plan
----------------------------------------------------------
Plan hash value: 2080390714

----------------------------------------------------------------------------------------
| Id  | Operation                     | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |        |     1 |    20 |    82   (2)| 00:00:01 |
|   1 |  SORT ORDER BY                |        |     1 |    20 |    82   (2)| 00:00:01 |
|*  2 |   FILTER                      |        |       |       |            |          |
|*  3 |    TABLE ACCESS FULL          | USER$  |    39 |   780 |     4   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS BY INDEX ROWID| OBJ$   |     1 |    10 |     4   (0)| 00:00:01 |
|*  5 |     INDEX RANGE SCAN          | I_OBJ2 |       |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter( EXISTS (SELECT 0 FROM "SYS"."OBJ$" "O" WHERE "O"."OWNER#"=:B1
              AND ("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2 OR
              BITAND("O"."FLAGS",2)2) AND "O"."TYPE#"5))
   3 - filter("U"."TYPE#"=1)
   4 - filter(("O"."TYPE#"1 OR BITAND("O"."FLAGS",2)2) AND ("O"."TYPE#"2
              OR BITAND("O"."FLAGS",2)2))
   5 - access("O"."OWNER#"=:B1)
       filter("O"."TYPE#"5)

Note
-----
   - SQL profile "SYS_SQLPROF_013f7fba46910000" used for this statement

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        157  consistent gets
          0  physical reads
          0  redo size
        883  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         28  rows processed

--可以发现逻辑读147,明显减少.sql显示使用sql profile来控制执行计划.
--至少这些对于优化经验不足的人还是有帮助,并且能获得一些oracle的建议,机器毕竟比人聪明.
--我越来越喜欢11G了.



目录
相关文章
|
SQL 数据库 存储
Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor
原文:Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor 一、工具概要     数据库应用系统性能低下,需要对其进行优化,     如果不知道问题出在哪里,可以使用性能检测工具sql server profiler。
2109 0
|
SQL Oracle 关系型数据库
Begin automatic SQL Tuning Advisor run for special tuning task "SYS_AUTO_SQL_TUNING_TASK"
<p><br></p> <p><br></p> <p></p> <div style="font-family:'lucida Grande',Verdana,'Microsoft YaHei'; font-size:14px; line-height:23.8px"> <div>hu May 29 22:00:00 2014</div> <div>Setting Resourc
4163 0
|
SQL Oracle 关系型数据库
SQL Tuning Advisor(STA) 到底做了什么?
      SQL Tuing Advisor(STA) 是Automatic Tuning Optimizer(自动优化调整器)的一部分。在前面的文章使用SQL tuning advisor(STA)自动优化SQL中描述了SQL Tuing Advisor(STA)的相关背景并给出示例。
857 0
|
SQL Oracle 关系型数据库
使用SQL tuning advisor(STA)自动优化SQL
      Oracle 10g之后的优化器支持两种模式,一个是normal模式,一个是tuning模式。在大多数情况下,优化器处于normal模式。基于CBO的normal模式只考虑很小部分的执行计划集合用于选择哪个执行计划,因为它需要在尽可能短的时间,通常是几秒或毫秒级来对当前的SQL语句进行解析并生成执行计划。
1200 0
|
3天前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
18 1