利用sql_tuning_Advisor调优sql

1.赋权给调优用户

grant ADVISOR  to xxxxxx;

2.创建调优任务

使用sql_text创建

复制代码
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    => 300,
         task_name     => 'test_sql_tuning',
         description   => 'Task to tune a query on emp');
END;
/
复制代码

使用sql_id进行创建

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

3.调整优化任务

--这里以调整调优任务时间为例
BEGIN
   DBMS_SQLTUNE.
    set_tuning_task_parameter (task_name   => 'my_sql_tuning_task',
                               parameter   => 'TIME_LIMIT',
                               VALUE       => 300);
END;

4.执行sql调优任务

BEGIN
   DBMS_SQLTUNE.EXECUTE_TUNING_TASK (task_name => 'test_sql_tuning');
END;
/

5.查看调优任务状态

SELECT status
  FROM USER_ADVISOR_TASKS
 WHERE task_name = 'test_sql_tuning';

6.查看调优任务结果

SET LONG 10000
SET LONGCHUNKSIZE 1000
SET LINESIZE 100
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('test_sql_tuning')
FROM   DUAL;

7.其他

7.1.sql_profile

查看数据库的sql_profile

SELECT * FROM DBA_SQL_PROFILES;

删除sql的sql_profile

exec dbms_sqltune.drop_sql_profile('SYS_SQLPROF_014b39f084c88000'); 

 7.2.删除调优

查看数据库中的调优任务

SELECT * FROM dba_advisor_tasks;
SELECT * FROM user_advisor_tasks;

删除调优任务

exec dbms_sqltune.drop_tuning_task('tunning_task_ddw7j6yfnw0vz');

7.3.将SQL踢出SharePool

-- 用SYS用户
SELECT A.SQL_ID,A.ADDRESS,A.HASH_VALUE  FROM V$SQLAREA A WHERE SQL_ID='chy30jy1cdg8q';
EXEC dbms_shared_pool.purge('00000000B6C61FC0,4094900530', 'c');

7.4.不分步的sql调优

复制代码
/* Formatted on 2023/5/17 上午 09:31:36 (QP5 v5.163.1008.3004) */
DECLARE
   v_task_name   VARCHAR2 (30);
BEGIN
   v_task_name :=
      DBMS_SQLTUNE.CREATE_TUNING_TASK (
         sql_id       => '',
         task_name    => 'tunning_task_ddw7j6yfnw0vz',
         time_limit   => 600);
   DBMS_SQLTUNE.execute_tuning_task (v_task_name);
   DBMS_OUTPUT.put_line (v_task_name);
END;

SELECT DBMS_SQLTUNE.report_tuning_task ('tunning_task_ddw7j6yfnw0vz') FROM DUAL;
复制代码

 

posted @   monkey6  阅读(379)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示