一、SQL语句到底是怎么执行的?
  想了解SQL语句到底是怎么执行的,那就需要进行SQL语句执行计划分析。
  那什么是SQL语句执行计划呢?
  就是Oracle服务器执行SQL语句的过程。例如确定是否使用索引、表连接顺序、表连接技术等。
  深入关注理解SQL语句的执行机制,至少要对关键模块的SQL语句进行Oracle SQL语句的执行计划分析。
 
  分析内容至少包括如下方面:

       1、表访问方式
       2、表索引类型和策略
       3、表连接类型和过程
       4、排序过程
       5、汇总过程
       6、并行处理过程


二、SQL性能分析量化指标
  量化指标至少包括如下几个:

      1、消耗时间:包括Elapsed Time、CPU Time等时间指标;
       2、内存消耗:包括Buffer Gets、Consistant Gets等指标;
       3、I/O消耗:包括Phytsical Reads、Physical Writes等指标;
       4、语句分析次数:包括Parses、Hard Pares、Soft Parses等指标;


三、SQL量化分析和优化工具
  Oracle提供了大量的分析工具。例如,Explain、SQL Trace、TKPROF、Auto Trace、AWR、ADDM、SQL Profiling、SQL Access Advisor、SQL Tuning Advisor、ASH等。接下来分别简单介绍下4个基本的诊断分析工具(Explain、SQL Trace、TKPROK和Auto Trace),其实灰常简单啦!(下一讲会分享图形化分析工具,之所以先讲存命令的。你想想银行给你个测试用的机器啥都没给你装,也不能上外网下载,从上到下几百个摄像头盯着你,想插U盘那是找死,学会丢掉拐杖走路先吧!)
  Oracle有大量使用的小工具,甚至使用的小命令,会给我们的开发、测试工作带来益处。没有合理充分地使用这些工具和命令,会大大降低工作效率。
  在我们公司做某些大规模性能测试时,为对多种技术方案进行公平的对比测试,最好每个案例的每次测试都在一致的环境下进行,特别是要将内存清空。最初接触Oracle时,只记得Oracle有清空shared pool的如下命令:
SQL> alter system flush shared_pool; 
  当我累死累活,一天重置数据库服务器N次以后,几乎绝望的情况下,发现一条命令可以清空buffer cache,不用再关机、重启了。 
SQL> alter system flush buffer_cache;
  好吧,在此分享了我的犯二经历,也希望大家不跟我一样犯二。

四、经典执行计划分析工具——Explain
  最经典的执行计划工具非Explain莫属没有之一。(经典归经典,想看得快请直接跳至第七节)通过Explain可以快熟了解SQL语句的执行过程。以下是Expliain的大致使用过程:
  1、使用之前,创建plan_table表 
SQL> @?/rdbms/admin/utlxplan;
  2、分析SQL语句执行计划 
SQL> explain plan for select count(*) from tab;  
  3、查看SQL语句执行计划 
SQL> @?/rdbms/admin/utlxpls.sql; ---- 9i 下只查看串行执行计划,10g既查看串行执行计划,也查看并行执行计划  
   
  

SQL> @?/rdbms/admin/utlxplp.sql; ---- 查看并行执行计划  
  该工具的一个特点是并没有真正执行语句,实际的执行过程可能与Explain分析结构不一样。
  例如在使用Explain分析之后,又对相关表建立了新的索引,或者采集了新的统计信息。
  关于Explain的详细介绍,请见Oracle联机文档 Oracle Database Performance Tuning Guide 10g Release 2(10.2)的第19章。

五、10g新功能:DBMS_XPLAN
  DBMS_XPLAN是针对Explain执行计划的显示功能,10g提供了一个增强的新功能,通过如下3种方式调用DBMS_XPLAN包,并且每个函数都提供了功能更强大的多种参数。
  1、DBMS_XPLAN.DISPLAY:显示存储在v$sql_plan视图中的语句执行计划;
  2、DBMS_XPLAN.DISPLAY_CURSOR:显示任何加载的CURSOR中的语句执行计划;
  3、DBMS_XPLAN.DISPLAY_AWR:显示保存在AWR中的语句执行计划;
  例如,使用如下语句显示当前刚解析过的SQL语句执行计划:  
select plan_table_output from table(dbms_xplan.display());  

六、SQL*Trace与TKPROF,另一套组合

     SQL*Trace和TKPROF的原理图如下:
  
 
     SQL*Trace与Explain的不同在于,它可以在会话(session)级、甚至整个实例级(Instance)对SQL语句进行跟踪(trace),并在操作系统中产生相应的trace文件。与Explain另一个不同点在于SQL*Trace是跟踪SQL语句的真实执行情况,并产生相关统计分析信息。
 
     因为SQL*Trace产生的Trace文件对于我们来说是难以读懂的。Oracle提供了与Trace配套的TKPROF实用程序,可以将Trace文件转换为可读性更强的报告。
     (1)、会话级跟踪
     当前会话跟踪:   
SQL> ALTER SESSION SET sql_trace = true;
SQL> EXECUTE dbms_session.set_sql_trace(true); 
     其他会话的跟踪:
SQL> EXECUTE dbms_system.set_sql_trace_in_session(session_in, serial_id, true);
     一般利用其他工具发现哪些会话比较消耗资源,再从v$session试图查询其session_id,serial_id,并通过上述命令对这些会话的活动惊醒跟踪和分析。
     (2)、实例级跟踪
     其实这玩意我也没用过,看书上说是将初始化参数SQL_TRACE设置成TRUE即可。
     但建议一般不要在实例级进行跟踪,一方面会对整个数据库形成压力和消耗,另一方面会产生太多的trace文件,很容易把系统装满。
     (3)、TKPROF的使用
     首先在USER_DUMP_DEST初始化参数指定的目录下(书上是这么写的,谁看到装满查看这个参数,记得通知我),根据时间就可发现产生的trace文件。
 
     上述最好一条命令的含义如下:
     ora_902.trc 为需要分析的trace文件;
     run2.txt 为产生的报告文件;
     sys=no 表示部分洗SYS用户执行的SQL语句;
     explain=hr/<hr 口令> 表示连接到hr用户,并进行执行计划分析;
     sort=execpu 表示按CPU消耗值,对该trace文件中所包含的SQL语句按倒序排序进行分析;
     Print=3 表示只分析前3条SQL语句,在本语句中,即只分析最消耗CPU资源的前3挑语句。
     TKPROF其实有好多选项,功能非常多。在操作系统环境简单输入tkprof,然后按回车键,就会显示tkprof帮助菜单。(不过我确实没发现这玩意,这一章完全是我都没看懂的读书笔记!)

七、出来吧,大神器:Autotrace
     说真的前面几个工具,我也会用!真心首推此款,Oracle 9i以后提供,针对SQL语句的诊断分析。与前面几个工具相比,Autotrace更简单实用,简单到几条命令而已,实用到马上就让你看见的SQL语句执行过程、资源消耗情况。
     (1)、打开Autotrace
SQL> set autotrace on;

简单一条语句启动,再执行SQL语句就能看到该语句的执行结果、执行计划、统计信息等。例如:

     执行结果与执行计划:
      
      执行计划:
   
     统计信息: 
   
     (2)、只看执行计划、统计信息
     调试过程中,我们也不必查看SQL语句输出结果,只想看执行计划、统计信息,例如:
SQL> set autotrace traceonly;
     (3)、只看执行计划
     调试过程中,我们可能只想看执行计划,例如:

SQL> set autotrace traceonly explain;
     (4)、只看统计信息
     调试过程中,我们也可能只想看统计信息,例如:

SQL> set autotrace statistics;
     (5)、帮助信息
     帮助信息如下:
  
     (6)、如何看统计信息
     重点看consistent gets和physical reads指标即可,它们分别代表内存消耗和磁盘I/O消耗,单位是数据块(DB_BLOCK_SIZE)大小。
     Autotrace详细介绍,请见Oracle联机文档 Oracle Database Performance Tuning Guide 10g Release 2(10.2)的第20章。
八、总结
     SQL语句分析,优先推荐Autotrace。如果仅想看看执行计划,又不想执行,推荐Explain。比如一条需要执行十分钟以上的SQL语句,就推荐用Explain。
     以上两款工具均针对单条SQL语句,如果想分析一个会话(Session)甚至整个实例的SQL语句,则使用SQL*Trace和TKPROF。
 
 

品味性能之道<五>:SQL分析工具的更多相关文章

  1. 品味性能之道<六>:图形化SQL分析工具

         在上一章里,重点分享了命令行SQL分析工具的使用方法.在本章将重点分享PL/SQL的SQL分析工具. 一.如何打开PL/SQL执行计划      开启PL/SQL这工具,推荐如下方法: 点击 ...

  2. 品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述

            一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述     ...

  3. 品味性能之道<十一>:JAVA中switch和if性能比较

    通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...

  4. 品味性能之道<十>:Oracle Hint

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  5. 品味性能之道<八>:Loadrunner关联技巧与字符处理

    一.概述       Loadrunner作为HP出品的性能测试工具,拥有太多奇妙魔法甜点供予性能测试人员享用,其中吃起来比较有嚼劲的那就是关联了.当然在关联之后我们还需要一些简单的字符处理,用以生成 ...

  6. 品味性能之道<七>:索引基础

    一.索引概述      索引(index),它是数据库必不可少的一部分.它其实很简单呐!很好理解.      索引好比如一本书的目录,一张地图,一个写字楼里挂在大堂墙上的公司名录,一个地铁站的出口指示 ...

  7. 品味性能之道<三>:方法论

    自顶向下的性能优化方法论 系统优化是包括系统设计.开发.产品上线.平台优化的全过程,不同阶段的优化工作对全系统所带来的效益是不同的.理想的性能优化论应该采用自顶向下的优化方法,即在项目设计.开发和上线 ...

  8. 品味性能之道<四>:管理重于技术

      一.性能优化中的角色分工 (1).老外的角色分工         在oracle性能优化方法论中,将IT系统中不同角色需要承担的性能优化工作罗列如下. 各司其职的角色分工 业务分析人员 1.业务需 ...

  9. 品味性能之道<二>:性能工程师可以具备的专业素养

          性能工程师可以具备的专业素养 程序语言原理,包括:C.C++.java及jvm.ASP,因为建站大部分外围应用和中间件都是JAVA编写,大部分的电商平台采用的ASP编写,底层核心系统是C/ ...

随机推荐

  1. Coxph model Pvalue Select2

    4   1) Put summary(coxphobject) into a variable summcph <- summary(coxphobject) 2) examine it wit ...

  2. 线程安全计算 AtomicLong

    一般如果我们自己写一个计数器方法,需要考虑线程安全问题,尤其高并发访问的时候. AtomicLong 已处理并发问题,直接使用.java.util.concurrent.atomic包提供多种线程安全 ...

  3. BDE 退出历史 迁移至FireDAC

    BDE组件套TQuery\TTable\TStoreProce结束历时使命. ADO组件套也停止更新, 将来是FireDAC组件套的江湖 Migrating BDE Applications to F ...

  4. Spring声明式事务不回滚问题

    疑问,确实像往常一样在service上添加了注解 @Transactional,为什么查询数据库时还是发现有数据不一致的情况,想想肯定是事务没起作用,出现异常的时候数据没有回滚.于是就对相关代码进行了 ...

  5. UI5-文档-4.1-Hello World!

    如你所知,SAPUI5是关于HTML5的.让我们开始构建第一个仅使用HTML的“Hello World”. Preview 浏览器显示文本“Hello World” Coding 你可以在此查看和下载 ...

  6. Object-c中的单例

    #import <UIKit/UIKit.h> @interface UniAudioPlayer:NSObject{ } +(UniAudioPlayer*) getInstance; ...

  7. sqlserver列重命名

    EXEC sp_rename 'tablename.[OldFieldName ]', 'NewFieldName', 'COLUMN'

  8. Haskell语言学习笔记(47)Arrow(2)

    Function, Monad, Arrow f :: Int -> (Int, Int) f = \x -> let y = 2 * x z1 = y + 3 z2 = y - 5 in ...

  9. 向数据库添加学生信息。存放在REQUEST对象里

    代码前几天已经发过了,但是程序一直还没运行出来,今天重新建立了一个数据库,才可以,下面补充上数据截图

  10. Spinnaker 介绍

    功能: 无论目标环境如何,Spinnaker 部署优势始终如一,它的功能如下: 通过灵活和可配置 Pipelines,实现可重复的自动化部署: 提供所有环境的全局视图,可随时查看应用程序在其部署 Pi ...