Oracle ——如何确定性能差的 SQL

http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/TSQ7/Default.aspx

本文主要说明在应用程序内书写和调优 SQL 语句。假设,你已经知道你应用程序中的哪些 SQL 语句需要注意。事实上,这不太容易。那么,我们如何隔离性能差的 SQL?任何中等大小的应用程序都是由成千上万行代码组成,其中还包含 SQL。一个性能差的应用程序可能就毁在一个语句上。我们从哪里开始?

当涉及 SQL 时,性能不佳有两方面:CPU 密集型语句(CPU-intensive statements)和 I/O 密集型语句(I/O-intensive statements)。

  • 前者很容易定位。所有的操作系统都可以让我们查看 CPU 密集型任务。这些任务可以追溯到一个特定用户,一个特定应用程序模块。 CPU 密集型模块一般都是由较差的代码和/或结构造成,而不是性能差的 SQL。一旦确定模块,你必须试图使之更有效率。一个可能的解决方案是将把某些处理移除程序,让数据库处理(高明点的 SQL,存储对象,内联函数,数组处理等)。
  • 第二个是 I/O 密集型的 SQL 语句。这些语句会导致大量的数据库 I/O(全表扫描,排序,更新等),并以很高代价运行几个小时。从 Oracle 7 开始,解决了 SQL 识别问题。通过查询数据库共享池区域,我们可以很容易确定大多数 I/O 密集型 SQL 语句。

下面 SQL 语句演示了如何确定 I/O 命中率低于 80%的 SQL 语句。这个命中率是,自从 SQL 语句第一次被解析到共享池,通过所有执行的语句反应整体 I/O。下面可能是最近几分钟或几天的结果:

sql> SELECT executions, 
   2        disk_reads, 
   3        buffer_gets,
   4        ROUND((buffer_gets - disk_reads) / buffer_gets, 2) hit_ratio,
   5        sql_text
   6     FROM   v$sqlarea
   7    WHERE  executions  > 0
   8     AND    buffer_gets > 0
   9     AND    (buffer_gets - disk_reads) / buffer_gets < 0.80
   10   order by 4 desc ;
 
EXECUTIONS DISK_READS BUFFER_GETS  HIT_RATIO SQL_TEXT
---------- ---------- ----------- ---------- -----------------------------------------------------------------------
        16        180         369        .51 SELECT SKU,PREPACK_IND,CASE_ID,TRANSFER_QTY,UNIT_COST,UNIT_RETAIL,ROWID
                                             FROM TSF_DETAIL WHERE transfer = :1  order by sku
        16        30          63         .52 SELECT TRANSFER,TO_STORE,TO_WH FROM TSFHEAD  WHERE TRANSFER = :b1  AND
                                             TRANSFER_STATUS = 'A'
        2         3           7          .57 SELECT SKU   FROM UPC_EAN  WHERE UPC = :b1
        12        14          35         .60 SELECT SUBSTR(DESC_UP,1,30),DEPT,SYSTEM_IND   FROM DESC_LOOK  WHERE
                                             SKU = :b1
        14        13          35         .63 SELECT UNIT_COST,UNIT_RETAIL,SUBCLASS FROM WIN_SKUS WHERE SKU = :b1

事实上,我们发现对特定的 SQL,上面的数据有些误导,其实语句没有问题。考虑下面 v$sqlarea 输出:

Executions Disk_Reads Buffer_Gets Hit_Ratio Sql_Text
---------- ---------- ----------- --------- --------------------
    2          6          19         0.68   SELECT A.EMP_NO, ...

该语句的命中率很低,但事实上它很有效。因为,SQL 是通过 UNIQUE 索引操作的,物理磁盘读取的数量几乎与逻辑读取一样。UNIQUE 索引显著减少了整体的物理和逻辑磁盘 I/O 数量,导致了一个令人误解的低命中率。

下面例子,命中率很好。但是真的很好吗?

Executions Disk_Reads Buffer_Gets Hit_Ratio Sql_Text
---------- ---------- ----------- --------- --------------------
    2         3625       178777      0.98   SELECT A.EMP_NO, ...

这个 SQL 语句看上去很有效。但是, 当我们仔细看时,事情就不是那么回事了。命中率并没有透露出,该语句存在五个表连接,并且每次执行进行了超过 3600 个物理磁盘读取。这是否太多了?是否有效?若不进一步研究,无法回答这两个问题。事实上,这个实例中,五个表的中其一个错误地执行了全表扫描。通过重新构造 SQL,我们可以减少物理磁盘 I/O 到小于 50,同时,也显著减少逻辑磁盘 I/O。巧合的是,命中率也下降到不到 70%。

我们首选 V$SQLAREA 查询是每个语句执行的物理磁盘 I/O 的真实报告。命中率是信息性的,但有时会产生误导。逻辑 I/O 相关的很少。如果语句执行 1,000,000 个逻辑 I/O,但只用了不到十分之一秒,这就没人在乎了。这是总的物理 I/O,几乎消耗了所有的时间,和确定潜在不正确的 SQL。例如:

sql> SELECT sql_text, executions,
             ROUND(disk_reads / executions, 2) reads_per_run,
             disk_reads, buffer_gets,
             ROUND((buffer_gets - disk_reads)
                  / buffer_gets, 2) hit_ratio,
             sql_text
      FROM   v$sqlarea
      WHERE  executions  > 0
      AND    buffer_gets > 0
      AND    (buffer_gets - disk_reads) / buffer_gets < 0.80
      ORDER by 3 desc ;

前两个语句会报告更具启发性的结果:

Executions Reads_Per_Run Disk_Reads Buffer_Gets Hit_Ratio Sql_Text
---------- ------------- ---------- ----------- --------- ------------
    2           3            6          19        0.68    SELECT ...
    2         1812.5       3625       178777      0.98    SELECT ...

从视图 V$SQLAREA 中,我们可以立即隔离所有具有高物理读取的语句。这些语句可能并不一定低效或写得不好,但恰恰是它们需要进一步调查或调整。

o_r_%E7%BF%BB%E8%AF%91.jpg

转载于:https://www.cnblogs.com/liuning8023/archive/2012/09/06/2674238.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中的委托和事件(续)

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 欢迎浏览本文的后续文章&#xff1a; C#中的委托和事件(续)PDF 浏览&#xff1a;http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdf文中代码在VS2005下通过&#xff0c;由于VS2003(.Ne…

Java LocalDate类| minusYears()方法与示例

LocalDate类minusYears()方法 (LocalDate Class minusYears() method) minusYears() method is available in java.time package. minusYears()方法在java.time包中可用。 minusYears() method is used to subtract the given years from this LocalDate and return the LocalD…

ffmpeg 命令添加图片水印

使用ffplay预览一下&#xff1a; ffplay -i cctvhttp.flv -vf “moviewatermark.png[watermark];[in][watermark]overlay x10:y10[out]” -x 640 -y 480 参数&#xff1a; 有两个过滤器movie\overlay movie&#xff1a;读取watermark.png输出 [watermark]可以理解自定义的的变…

实验9 SQL Server 的触发器

实验9 SQL Server 的触发器一、实验目的 1.了解触发器的触发过程和类型 2.通过执行SQL脚本&#xff0c;掌握创建触发器并测试触发器 3.掌握通过使用触发器维护数据完整性的方法。 二、实验要求 1.按指定要求创建触发器。 三、实验步骤 1.创建一个名为tr_age的触发器&#xff0…

struts2学习笔记二--准备struts2的学习和开发环境

准备struts2的学习和开发环境1 导包2 参照开发包自带的例子在web.xml文件中配置3 参照开发包自带的例子编写Action类和配置struts.xml文件<struts><package name"demo" namespace"/hello/word"><action name"test" class"cn…

C#实现动态桌面背景图片切换

问题描述&#xff1a;凝视桌面背景&#xff0c;突感如果桌面背景是变化的像win7一样&#xff0c;该多有意思啊。闹钟瞬间产生一个念头&#xff0c;用C#写一个动态切换桌面背景的图片。如何实现这个想法了&#xff0c;我思考了一会儿&#xff0c;想到了如下的一些需要解决的问题…

duration java_Java Duration类| withSeconds()方法与示例

duration java持续时间类withSeconds()方法 (Duration Class withSeconds() method) withSeconds() method is available in java.time package. withSeconds()方法在java.time包中可用。 withSeconds() method is used to represent this Duration with the given seconds. wi…

ffmpeg 命令画中画效果

画中画效果也是和图片水印一样使用movie配合overlay实现 使用ffplay预览一下&#xff1a; ffplay -i cctvhttp.flv -vf “moviecctvhttp.flv[subm];[in][subm]overlayx20:y30[o ut]” -x 640 -y 480 &#xff08;可以看到是有两层视频的&#xff09; 用个不同的视频再测试&…

实验10 SQL Server 数据备份/恢复

实验10 SQL Server 数据备份/恢复一、实验目的 1.了解数据库备份的过程和属性设置&#xff1b; 2.掌握应用企业管理器备份和恢复数据库&#xff1b; 3.掌握应用T-SQL备份和恢复数据库&#xff1b; 4.掌握数据导入/导出的方法。 二、实验要求 1.创建指定数据库的备份. 2.恢复数…

指针和数组

数组的概念与指针的概念联系非常解密。其实数组的标识相当于它的第一个元素的地址&#xff0c;就像一个指针相当于它所指向的第一个元素的地址&#xff0c;因此其实它们是同一个东西 int numbers [20];int * p;下面的赋值为合法的&#xff1a; p numbers; 这里指针p 和numbers…

程序集(初尝,也是为插件程序准备)

拓展名是EXE或者DLL的.net可执行程序称为程序集。 .net程序集与一般的EXE&#xff0c;DLL的区别在于&#xff0c;它包含有metadata。 私有程序集 位于应用程序的目录下。共享程序集 必须有一个特殊的版本号&#xff0c;唯一的名称&#xff0c;通常安装在全局程序集缓存&#xf…

Java BigInteger类| 带示例的shiftLeft()方法

BigInteger类shiftLeft()方法 (BigInteger Class shiftLeft() method) shiftLeft() method is available in java.math package. shiftLeft()方法在java.math包中可用。 shiftLeft() method is used to shift the given number of bits towards the left side in this BigInteg…

汇编语言-011(无符号乘法指令MUL、有符号乘法指令IMUL、对比MUL乘法指令与SHL移位方式、符号位扩展指令,CBW,CWD,CDQ、DIV 无符号除法指令、IDIV 有符号除法指令)

1:无符号乘法指令MUL .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data val1 WORD 2000h val2 WORD 0100h .code main PROC;8位乘法mov al,5h ;被乘数mov bl,10hmul bl ;AX 0050h ,CF,OF 0;16位乘法mov ax,val1mul val2 ;DX:AX 002000…

编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)

编写一个程序&#xff0c;实现将存放在AX和DX中的32位数据循环右移二进制数的4位。&#xff08;DX存放高字节内容&#xff0c;AX存放低字节内容&#xff09; P151 例4.9 汇编思路&#xff1a; AX右移四位后&#xff0c;使用BH接收AL的低四位数据&#xff0c;得到BH的八位数据…

[转 scrum] 大型项目开发使用敏捷是否合适?不该问的问题

原文地址&#xff1a;http://www.scrumcn.com/agiledev/html/?167.html转载于:https://www.cnblogs.com/cly84920/archive/2010/03/17/4426844.html

汇编语言-012(扩展加法指令ADC、带借位减法指令SBB、执行加法后进行ASCII调整指令、AAS 、AAM、AAD 、DAA指令将和数转成压缩十进制格式)

1:ADC : 扩展加法指令ADC .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCmov dl,0mov al,0FFhadd al,0FFh ;ALFEhadc dl,0 ;DL:AL 01FEhmov edx,0mov eax,0FFFFFFFFhadd eax,0FFFFFFFFh ;EAX FFFFFFFEhadc edx,0 …

c#中textbox属性_C#.Net中的TextBox.Visible属性与示例

c#中textbox属性Here we are demonstrating use of Visible property of TextBox Control. 在这里&#xff0c;我们演示了TextBox Control的Visible属性的使用。 Visible property contains two values 可见属性包含两个值 True: Using this - textbox can be visible on par…

VS2010报表

http://technet.microsoft.com/zh-cn/library/dd220516.aspx转载于:https://www.cnblogs.com/mingyongcheng/archive/2012/09/11/2679722.html

思维的领域特殊性

思维的领域特殊性 1971年&#xff0c;心理学家Danny Kahneman和Amos Tversky做了这样一个实验&#xff0c;他们问统计学教授一些不像统计学的统计学问题&#xff0c;其中一个大概如下&#xff1a;假设你生活的城市有两家医院&#xff0c;一家大一家小&#xff0c;某一天&#x…

汇编语言-013(DAS 、DAA与DAS、QWORD类型用SBB借位减法、编写指令将AX符号扩展到EAX,不能使用CWD、用SHR和条件判断指令将AL循环右移一位、SHLD、压缩十进制转换)

1&#xff1a;DAS : SUB或SBB在AL中生成二进制结果&#xff0c;DAS&#xff08;减法后的十进制调整&#xff09;转压缩十进制格式 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC;计算85-48mov bl,48hmov al,85hsub al,bl ;AL3Dhd…