SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化

SQL> conn scott/tiger

SQL> create table manual_sta(id varchar2(10), name varchar2(128));
SQL> insert into manual_sta select object_id, object_name from dba_objects;
SQL> commit;

在id列上创建一个索引,并收集统计信息。

SQL> create index idx_manual_sta on manual_sta(id);
SQL> exec dbms_stats.gather_table_stats(user,'manual_sta',cascade=>true);

调用STA对SQL语句进行调优:

SQL> declare
l_task_id varchar2(20);
l_sql varchar2(2000); begin
l_sql := 'select * from manual_sta where id=2000';
l_task_id := dbms_sqltune.create_tuning_task(
  sql_text=>l_sql,
  user_name=>'SCOTT',
  scope=>'COMPREHENSIVE',
  time_limit=>30,
  task_name=>'MANUAL_STA'
);
end;
/

执行sql调优任务。

SQL> begin
  dbms_sqltune.execute_tuning_task('MANUAL_STA');
end;
/

显示调优结果

SQL> set serveroutput on size 999999;
SQL> set long 99999999;
SQL> select dbms_sqltune.report_tuning_task('MANUAL_STA') from dual;

显示结果中会建议建一个函数索引。

删除任务:

SQL> exec dbms_sqltune.drop_tuning_task('MANUAL_STA');

物化视图

SQL> conn /as sysdba
SQL> grant create materialized view to scott; SQL> conn scott/tiger SQL> create table e as select * from emp;
SQL> create table d as select * from dept; SQL> drop materialized view log on e;
SQL> drop materialized view log on d;
SQL> drop materialized view mv_e_d; SQL> create materialized view log on e with rowid(empno, ename, job, mgr, hiredate, sal, comm, deptno) including new values; SQL> create materialized view log on d with rowid(deptno, dname, loc) including new values; SQL> create materialized view mv_e_d build immediate refresh complete on commit as select a.dname, sum(b.sal) total_sal, count(*) c_sal from d a, e b where a.deptno=b.deptno group by a.dname;

SQL Acess Advisor(SAA)

1. 创造数据库负载

vi /u01/app/oracle/temptest/1.sql

SELECT /* QueryDW 1*/
t.calendar_month_desc,sum(s.amount_sold) AS dollars
FROM sh.sales s
, sh.times t
WHERE s.time_id = t.time_id
AND s.time_id between TO_DATE('01-JAN-2000', 'DD-MON-YYYY')
AND TO_DATE('01-JUL-2000', 'DD-MON-YYYY')
GROUP BY t.calendar_month_desc;

vi /u01/app/oracle/temptest/2.sql

SELECT /* QueryDW 2 */
ch.channel_class, c.cust_city, t.calendar_quarter_desc,
SUM(s.amount_sold) sales_amount
FROM sh.sales s, sh.times t, sh.customers c, sh.channels ch
WHERE s.time_id = t.time_id
AND s.cust_id = c.cust_id
AND s.channel_id = ch.channel_id
AND c.cust_state_province = 'CA'
AND ch.channel_desc in ('Internet','Catalog')
AND t.calendar_quarter_desc IN ('1999-01','1999-02')
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;

vi /u01/app/oracle/temptest/3.sql

SELECT /* QueryDW 3 */
ch.channel_class, c.cust_city, t.calendar_quarter_desc,
SUM(s.amount_sold) sales_amount
FROM sh.sales s, sh.times t, sh.customers c, sh.channels ch
WHERE s.time_id = t.time_id
AND s.cust_id = c.cust_id
AND s.channel_id = ch.channel_id
AND c.cust_state_province = 'CA'
AND ch.channel_desc in ('Internet','Catalog')
AND t.calendar_quarter_desc IN ('1999-03','1999-04')
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;

vi /u01/app/oracle/temptest/4.sql

SELECT /* QueryDW 4 */ c.country_id, c.cust_city, c.cust_last_name
FROM sh.customers c
WHERE c.country_id in (52790, 52798)
ORDER BY c.country_id, c.cust_city, c.cust_last_name;

执行以上4个脚本:

SQL> conn sh/sh
@/u01/app/oracle/temptest/1.sql
@/u01/app/oracle/temptest/2.sql
@/u01/app/oracle/temptest/3.sql
@/u01/app/oracle/temptest/4.sql

2. 创建sql调优集:

vi /u01/app/oracle/temptest/sts.sql

connect / as sysdba
set echo on
select sql_text from v$sql where sql_text like '%QueryDW%'; BEGIN
  dbms_sqltune.drop_sqlset('MY_STS_WORKLOAD');
END;
/ DECLARE
  sqlsetname VARCHAR2(30);
  sqlsetcur dbms_sqltune.sqlset_cursor;
BEGIN
  sqlsetname := 'MY_STS_WORKLOAD';   dbms_sqltune.create_sqlset(sqlsetname, 'Access Advisor data');   OPEN sqlsetcur FOR
  SELECT VALUE(P)
  FROM TABLE(
    dbms_sqltune.select_cursor_cache(
    'sql_text like ''SELECT /* QueryDW%''',
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    null)
  ) P; dbms_sqltune.load_sqlset(sqlsetname, sqlsetcur);
END;
/

执行以上的脚本:

@/u01/app/oracle/temptest/sts.sql

此脚本创建了一个sql调优集:MY_STS_WORKLOAD,此集中包含了第一步执行的sql语句

3. 进入OEM查看调用SAA来对调优集:MY_STS_WORKLOAD中的sql语句进行调优

4. 清除实验环境:

SQL> connect / as sysdba
SQL> exec dbms_sqltune.drop_sqlset('MY_STS_WORKLOAD');
SQL> drop materialized view log on sh.customers;
SQL> drop materialized view log on sh.channels;
SQL> drop materialized view log on sh.times;
SQL> drop materialized view log on sh.sales;

OCP读书笔记(15) - 管理SQL性能调优的更多相关文章

  1. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  2. JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》

    目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...

  3. spark2.+ sql 性能调优

    1.在内存中缓存数据 性能调优主要是将数据放入内存中操作,spark缓存注册表的方法 版本 缓存 释放缓存 spark2.+ spark.catalog.cacheTable("tableN ...

  4. OCP读书笔记(13) - 管理内存

    SGA 1. 什么是LRULRU表示Least Recently Used,也就是指最近最少使用的buffer header链表LRU链表串联起来的buffer header都指向可用数据块 2. 什 ...

  5. SQL性能调优基础教材

    一.数据库体系结构 1.       Oracle数据库和实例 数据库:物理操作系统文件或磁盘的集合. 实例:一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程 ...

  6. mysql之sql性能调优

    sql调优大致分为两步:1 如何定位慢查询   2 如何优化sql语句. 一:定位慢查询 -- 显示到mysql数据库的连接数 -- show status like 'connections'; - ...

  7. [大牛翻译系列]Hadoop(15)MapReduce 性能调优:优化MapReduce的用户JAVA代码

    6.4.5 优化MapReduce用户JAVA代码 MapReduce执行代码的方式和普通JAVA应用不同.这是由于MapReduce框架为了能够高效地处理海量数据,需要成百万次调用map和reduc ...

  8. OCP读书笔记(16) - 管理资源

    使用者组 创建资源用户组OLTP_GRP,将用户HR,OE加入此组: BEGIN dbms_resource_manager.clear_pending_area(); dbms_resource_m ...

  9. SQL 性能调优日常积累

    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左 ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1017次数

         题目 解决代码及点评 /* 功能:有人说在400, 401, 402, ...499这些数中4这个数字共出现112次,请编程序判定这 种说法是否正确.若正确请打印出'YE ...

  2. Netty源代码学习——ChannelPipeline模型分析

    參考Netty API io.netty.channel.ChannelPipeline A list of ChannelHandlers which handles or intercepts i ...

  3. Swift - 使用CGBlendMode改变UIImage颜色

    类似于PS,Swift中也可对图片UIImage进行图层混合(blending),而且提供了相当丰富的混合模式(blendMode).本文先介绍使用其中的kCGBlendModeDestination ...

  4. axure母版(模板)区域介绍

    axure的模板区域是非常重要的一个功能,网站的头部.尾部部分等很多页面同时用到的内容,都可以使用母版,因为在母版中只需要修改一次,就可以实现所有的页面更新,可以大大的加速原型的制作速度.需要重复理解 ...

  5. 基于visual Studio2013解决C语言竞赛题之1052求根

       题目 解决代码及点评 /* 功能:用简单迭代法解方程 e^x - x - 2 = 0 它有两个根(如图),其迭代公式为: 1) x[n+1]= e^x*n-2 (初值X<0时) ...

  6. python 获取当前日期 星期

    from datetime import datetime d =datetime.today()     #获取当前日期时间 d.isoweekday()           #获取时间周几

  7. Swift - 通过url地址打开web页面

    通过UIApplication.sharedApplication().openURL()方法,可以使用浏览器打开相应的网页. 1 2 3 var urlString = "http://h ...

  8. C++学习之路—继承与派生(一):基本概念与基类成员的访问属性

    (本文根据<c++程序设计>(谭浩强)总结而成,整理者:华科小涛@http://www.cnblogs.com/hust-ghtao,转载请注明) 1   基本思想与概念 在传统的程序设计 ...

  9. iot表和heap表排序规则不同

    SQL> select * from (select * from t1 order by id ) where rownum<20; ID A1 A2 A3 ---------- --- ...

  10. mysql 执行计划走索引

    <pre name="code" class="html">mysql> desc AssignClientManager; +------- ...