iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >SQL中DBMS_SQLTUNE怎么用
  • 996
分享到

SQL中DBMS_SQLTUNE怎么用

2024-04-02 19:04:59 996人浏览 安东尼
摘要

这篇文章主要介绍了sql中DBMS_SQLTUNE怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 SQL调

这篇文章主要介绍了sql中DBMS_SQLTUNE怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

SQL调优工具包DBMS_SQLTUNE的使用方法

oracle 提供了优化建议功能包DBMS_SQLTUNE,该包可以帮助我们分析SQL,并提供优化建议。

原有执行计划
alter session set statistics_level=all;
set serveroutput off
select * from test.emp where ename='SCOTT' and DEPTNO=20;
SELECT * FROM table(dbms_xplan.display_cursor(NULL,NULL,'runstats_last'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
SQL_ID  8k1gbrapm7zpd, child number 0
-------------------------------------
select * from test.emp where ename='SCOTT' and DEPTNO=20

Plan hash value: 3956160932

------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |      1 |00:00:00.01 |       4 |
|*  1 |  TABLE ACCESS FULL| EMP  |      1 |      1 |      1 |00:00:00.01 |       4 |
-------------------------------------------------------------------------------------

Predicate InfORMation (identified by operation id):
---------------------------------------------------
   1 - filter(("ENAME"='SCOTT' AND "DEPTNO"=20))


下面就用DBMS_SQLTUNE优化该SQL
--1.赋予用户ADVISOR权限
grant ADVISOR  to test;

--2.创建sql tuning任务
conn test/test

DECLARE
 my_task_name VARCHAR2(30);
 my_sqltext   CLOB;
BEGIN
 my_sqltext := 'select * from emp where ename= :name and DEPTNO= :deptno';
 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
         sql_text    => my_sqltext,
bind_list   => sql_binds(anydata.convertvarchar2(10),anydata.convertnumber(2)), 
         user_name   => 'TEST',
         scope       => 'COMPREHENSIVE',
         time_limit  => 60,
         task_name   => 'test_sql_tuning', 
         description => 'Task to tune a query on emp');
END;
/

参数说明:
bind_list:多个绑定变量以','逗号分隔。参数值一定要根据绑定变量对应的列的类型书写.
如:emp.ename类型是VARCHAR2(10),那么就要写成
 bind_list    =>sql_binds(anydata.convertvarchar2(10)),

time_limit:执行的最长时间,默认是60。

scope:
LIMITED,用大概1秒时间去优化SQL语句,但是并不进行SQL Profiling分析。
COMPREHENSIVE,进行全面分析,包含SQL Profiling分析;比LIMITED用时更长。

**也可以用sql_id创建sql tunning任务,比用sql_text方便很多
FUNCTION CREATE_TUNING_TASK RETURNS VARCHAR2
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQL_ID                         VARCHAR2                IN
 PLAN_HASH_VALUE                NUMBER                  IN     DEFAULT
 SCOPE                          VARCHAR2                IN     DEFAULT
 TIME_LIMIT                     NUMBER                  IN     DEFAULT
 TASK_NAME                      VARCHAR2                IN     DEFAULT
 DESCRIPTION                    VARCHAR2                IN     DEFAULT

DECLARE
 my_task_name VARCHAR2(30);
BEGIN
  my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
         SQL_ID      => 'ddw7j6yfnw0vz',
         scope       => 'COMPREHENSIVE',
         time_limit  => 60,
         task_name   => 'tunning_task_ddw7j6yfnw0vz', 
         description => 'Task to tune a query on  ddw7j6yfnw0vz');
END;




--3.查看任务名 SELECT TASK_NAME 
FROM   DBA_ADVISOR_LOG 
WHERE  OWNER = 'TEST';
TASK_NAME
------------------------------
test_sql_tuning

--4.执行sql tuning任务
BEGIN
  DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'test_sql_tuning' );
END;
/

--5.查看sql tunning任务状态
SELECT status 
FROM   USER_ADVISOR_TASKS 
WHERE  task_name = 'test_sql_tuning';
STATUS
-----------
COMPLETED

--6.展示sql tunning结果
SET LONG 10000
SET LONGCHUNKSIZE 1000
SET LINESIZE 100
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('test_sql_tuning')
FROM   DUAL;

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : test_sql_tuning
Tuning Task Owner  : TEST
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 60
Completion Status  : COMPLETED
Started at         : 04/01/2014 16:45:16
Completed at       : 04/01/2014 16:45:17

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Schema Name: TEST
SQL ID     : 95fv6dbj64d0f
SQL Text   : select * from emp where ename= :name and DEPTNO= :deptno

-------------------------------------------------------------------------------
FINDINGS SECTION (2 findings)
-------------------------------------------------------------------------------
1- Statistics Finding
---------------------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
  Table "TEST"."EMP" was not analyzed.

  Recommendation
  --------------
  - Consider collecting optimizer statistics for this table.
    execute dbms_stats.gather_table_stats(ownname => 'TEST', tabname =>
            'EMP', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
            method_opt => 'FOR ALL COLUMNS SIZE AUTO');

  Rationale
  ---------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
    The optimizer requires up-to-date statistics for the table in order to
    select a Good execution plan.

2- Index Finding (see explain plans section below)
--------------------------------------------------
  The execution plan of this statement can be improved by creating one or more
  indices.

  Recommendation (estimated benefit: 66.67%)
  ------------------------------------------
  - Consider running the Access Advisor to improve the physical schema design


DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
    or creating the recommended index.
    create index TEST.IDX$$_00D80001 on TEST.EMP("ENAME","DEPTNO");

  Rationale
  ---------
    Creating the recommended indices significantly improves the execution plan
    of this statement. However, it might be preferable to run "Access Advisor"
    using a representative SQL workload as opposed to a single statement. This
    will allow to get comprehensive index recommendations which takes into
    account index maintenance overhead and additional space consumption.

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original
-----------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    87 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP  |     1 |    87 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("ENAME"=:NAME AND "DEPTNO"=:DEPTNO)

2- Using New Indices
--------------------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
Plan hash value: 2106247215
----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    87 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP            |     1 |    87 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX$$_00D80001 |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING')
----------------------------------------------------------------------------------------------------
---------------------------------------------------
   2 - access("ENAME"=:NAME AND "DEPTNO"=:DEPTNO)

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


建议报告总结
<1>收集EMP表的统计信息
execute dbms_stats.gather_table_stats(ownname => 'TEST', tabname =>'EMP', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO');

<2>创建索引
create index TEST.IDX$$_00D80001 on TEST.EMP("ENAME","DEPTNO"); 


优化后执行计划
--------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |      1 |        |      1 |00:00:00.01 |       3 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP            |      1 |      1 |      1 |00:00:00.01 |       3 |
|*  2 |   INDEX RANGE SCAN          | IDX$$_00D80001 |      1 |      1 |      1 |00:00:00.01 |       2 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ENAME"='SCOTT' AND "DEPTNO"=20)


--7.完成后删除sql tunning任务
EXEC DBMS_SQLTUNE.DROP_TUNING_TASK('test_sql_tuning');

--8.其他
--sql tunning任务创建后,也可以修改参数
BEGIN
  DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER(
    task_name => 'test_sql_tuning',
    parameter => 'TIME_LIMIT', value => 300);
END;
/

--查看SQL Tuning Advisor的进展(task执行很久)
col opname for a20
col ADVISOR_NAME for a20
SELECT SID,SERIAL#,USERNAME,OPNAME,ADVISOR_NAME,TARGET_DESC,START_TIME SOFAR, TOTALWORK 
FROM   V$ADVISOR_PROGRESS 
WHERE  USERNAME = 'TEST';

感谢你能够认真阅读完这篇文章,希望小编分享的“SQL中DBMS_SQLTUNE怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: SQL中DBMS_SQLTUNE怎么用

本文链接: https://www.lsjlt.com/news/64162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL中DBMS_SQLTUNE怎么用
    这篇文章主要介绍了SQL中DBMS_SQLTUNE怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 SQL调...
    99+
    2024-04-02
  • SQL调优工具包DBMS_SQLTUNE怎么用
    小编给大家分享一下SQL调优工具包DBMS_SQLTUNE怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!oracle 提供了优化建议功能包DBMS_SQLTUNE,该包可以帮助我们分...
    99+
    2024-04-02
  • SQL性能的度量 - 利用Hints和dbms_sqltune进行SQL监控
    可以使用Hints对某个SQL开启实时监控 select count(*) from scott.emp where sal>2000; 使用dbms_...
    99+
    2024-04-02
  • sql中as怎么用
    这篇文章给大家分享的是有关sql中as怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、as可以被用作重命名列名或者表名,如有一张表table,表中有2个列:column1...
    99+
    2024-04-02
  • sql中isnull怎么用
    这篇文章主要介绍了sql中isnull怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ISNULL使用指定的替换值替换 NULL。语法:...
    99+
    2024-04-02
  • sql中like怎么用
    这篇文章给大家分享的是有关sql中like怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。sql中like的用法:操作符LIKE利用通配符把一个值与类似的值进行比较,通配符有...
    99+
    2024-04-02
  • sql中filename怎么用
    filename 函数用于返回文件系统的完整路径和名称。它可以通过以下语法使用:select filename()。通过该函数,您可以访问存储在文件系统中的数据,用于 open 和 ex...
    99+
    2024-05-02
  • sql中reference怎么用
    sql 中的 reference 关键字用于定义外键约束,确保数据完整性。外键约束要求子表中的列引用父表中的主键列。语法为:alter table child_table add for...
    99+
    2024-05-12
  • sql中minus怎么用
    sql中的minus运算符用于从一个表中减去另一个表中的行,返回两组行之间的差集:语法:select from table1 minus select from ...
    99+
    2024-05-02
  • sql中drop怎么用
    sql drop 命令用于删除数据库对象,如表、视图、索引、约束或过程,语法为:drop [对象类型] 对象名称。其中对象类型可以是 database、view、index、constr...
    99+
    2024-05-07
  • sql中nvl怎么用
    nvl 函数在 sql 中替换 null 值,其语法为 nvl(expression, replacement_value)。它通过检查第一个参数 expression,如果为...
    99+
    2024-05-09
  • sql中nullif怎么用
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • SQL中SELECT怎么用
    这篇文章主要为大家展示了“SQL中SELECT怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL中SELECT怎么用”这篇文章吧。 ...
    99+
    2024-04-02
  • sql中in怎么用
    这篇文章给大家分享的是有关sql中in怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。IN 操作符IN 操作符允许我们在 WHERE 子句中规定多个值。SQL IN ...
    99+
    2024-04-02
  • SQL中pq_distribute怎么用
    这篇文章主要介绍SQL中pq_distribute怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!pq_distribute提示通常被用于提升数据仓库中分区表间的连接操作性能。 ...
    99+
    2024-04-02
  • SQL中case when怎么用
    这篇文章将为大家详细讲解有关SQL中case when怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SQL中case when的用法Case具有两种格式:简单Cas...
    99+
    2024-04-02
  • SQL中函数怎么用
    这篇文章主要为大家展示了“SQL中函数怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL中函数怎么用”这篇文章吧。 1、d...
    99+
    2024-04-02
  • sql中join on怎么用
    sql 中的 join on 将多张表中记录基于共同字段组合在一起,用法如下:定义 join 类型:inner join、left join、right join指定比较运算符:=、&g...
    99+
    2024-05-08
  • sql中的rank()怎么用
    核⼼答案:sql 中的 rank() 函数用于返回指定行在结果集中的排名,基于行中值的排序。详细描述:rank() 函数通过 over 子句指定分区和排序表达式。它根据指定列或表达式的排...
    99+
    2024-05-09
  • sql中exists怎么使用
    在SQL中,EXISTS是一个用于检查子查询结果是否存在的操作符。它返回一个布尔值,表示是否存在。以下是EXISTS的使用方法:1....
    99+
    2023-08-08
    sql exists
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作