oracle中怎么确定性能差的SQL语句

oracle中怎么确定性能差的SQL语句,当涉及 SQL 时,性能不佳有两方面:CPU 密集型语句(CPU-intensive statements)和 I/O 密集型语句(I/O-intensive statements)。

oracle中怎么确定性能差的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

   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, …

FineVoice语音克隆 FineVoice语音克隆

免费在线语音克隆,1 分钟克隆你的声音,保留口音和所有细微差别。

FineVoice语音克隆 61 查看详情 FineVoice语音克隆

该语句的命中率很低,但事实上它很有效。因为,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

      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 中,我们可以立即隔离所有具有高物理读取的语句。这些语句可能并不一定低效或写得不好,但恰恰是它们需要进一步调查或调整。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/510586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
苹果手机如何查看充电发热情况
上一篇 2025年11月9日 00:27:15
如何解除磁盘写保护
下一篇 2025年11月9日 00:27:22

相关推荐

  • 在 C++ 框架中实现极致性能的秘诀

    在 c++++ 框架中实现极致性能的秘诀:微优化代码:内联函数、去除冗余计算、使用现代编译器、使用 профилировщик。优化体系结构:多线程、分层缓存、减少锁争用、使用并行数据结构。管理资源:内存管理、网络优化、数据库访问、使用缓存。 在 C++ 框架中实现极致性能的秘诀 在当今快节奏的世界…

    2026年5月10日
    000
  • php实现哪些功能

    PHP是一种通用脚本语言,可用来实现广泛的功能,包括:动态Web开发:生成响应用户请求的动态 веб页面。内容管理系统(CMS):构建允许用户管理网站内容的CMS。电子商务:开发具有购物车、订单处理和支付网关集成的电子商务网站。服务器端编程:编写命令行脚本和工具。文件操作:创建、读取、写入和删除文件…

    2026年5月10日
    000
  • SQL查询:精确判断事件过期,结合日期与时间列

    本文旨在解决数据库中事件过期判断不精确的问题,特别是当事件的过期日期和时间分别存储在不同列时。我们将探讨两种主流的sql查询策略:一种是利用逻辑运算符`or`和`and`进行分情况判断,另一种是通过合并日期和时间列为单一时间戳进行直接比较。文章将详细阐述每种方法的实现方式、适用场景及相关注意事项,确…

    2026年5月10日
    100
  • HTML表单如何实现白名单功能?怎样只允许授权用户?

    要实现%ignore_a_1%的白名单功能并确保只有授权用户操作,核心答案是必须依赖后端服务器进行严格的身份认证、会话管理、授权检查和数据验证,前端仅能提供用户体验层面的初步提示而不能保障安全;具体而言,首先通过用户身份认证(如用户名/密码或oauth)确认用户身份,服务器创建会话并返回标识符,后续…

    2026年5月10日
    800
  • 如何用C#实现数据库的跨平台迁移?使用EF Core工具?

    使用EF Core实现跨平台数据库迁移,需定义实体与DbContext,通过动态配置不同数据库提供程序,利用EF Core CLI生成并应用迁移,结合Fluent API处理数据库差异,确保结构与数据兼容。 要实现数据库的跨平台迁移,C# 中最常用且高效的方式是使用 Entity Framework…

    2026年5月10日
    000
  • Python连接MySQL 5.1:克服旧版认证与字符集兼容性挑战

    本教程详细阐述了如何使用Python 3和mysql.connector库成功连接到老旧的MySQL 5.1数据库。文章重点介绍了解决旧版认证协议和字符集兼容性问题的关键配置,特别是use_pure=True和charset=’utf8’的重要性,并提供了可运行的代码示例。同…

    2026年5月10日
    000
  • C++ 函数性能优化与代码可维护性的权衡

    在c++++开发中,函数性能优化和代码可维护性需要权衡。优化方法包括:避免复制代码,使用函数和模板提高可维护性和效率。提高本地性,尽量在本地范围内访问变量,使用引用或指针。谨慎使用内联,避免代码膨胀。根据性能要求选择合适的算法和数据结构。避免不必要的对象创建。 C++ 函数性能优化与代码可维护性的权…

    2026年5月10日
    000
  • 想提升IT技能?哪些含金量高的认证值得考?

    it职业发展:高含金量认证助您成功 想在IT领域提升竞争力?选择合适的认证至关重要。本文推荐几项国内外认可度高的IT认证,助您在职业道路上更进一步。 热门认证推荐: 1. 高级软件设计师(软考高级): 国内IT领域含金量最高的认证之一。涵盖软件工程、项目管理及计算机基础知识。证明您在软件设计和开发方…

    2026年5月10日
    000
  • 优化Tkinter主题性能:解决UI卡顿与提升响应速度

    本文旨在探讨Tkinter应用中主题性能下降的问题,尤其是在Windows和macOS平台上使用图像密集型主题时。我们将分析导致UI卡顿的常见原因,并提供优化策略,包括选择高性能主题(如sv-ttk)、减少图像依赖,以及在必要时考虑其他现代GUI框架,以帮助开发者构建更流畅、响应更快的用户界面。 T…

    2026年5月10日
    000
  • 什么是资产代币化(Asset Tokenization)?它如何将现实世界资产带入区块链?

    资产代币化是通过区块链将房产、股票等实体资产权益转化为可分割的数字代币。首先选择目标资产并由合规机构确权估值,随后在链上发行对应代币并通过智能合约绑定权益比例,实现自动化分红与转让。为确保真实性,引入第三方审计和去中心化预言机同步链下数据,资金流由托管账户与链上地址联动记录,提升透明度。代币化降低投…

    2026年5月10日
    000
  • MySQL、PostgreSQL、SQL Server和Oracle中空字符串、数字0和NULL占用空间有何区别

    不同数据库系统中空字符串、数字0和NULL的存储空间差异 本文比较了MySQL InnoDB、PostgreSQL、SQL Server和Oracle数据库中,空字符串(”)、数字0和NULL值在磁盘上所占用的空间大小。 MySQL InnoDB存储引擎: 整型字段: NULL: 不占用…

    2026年5月10日
    000
  • html文档中含有java怎么运行_html含java运行方法【教程】

    现代浏览器不支持Java Applet,推荐通过JavaScript调用Java后端服务或使用WebAssembly运行Java代码。 如果您在HTML文档中嵌入了Java代码,但发现无法正常运行,这通常是因为现代浏览器不再支持Java小程序(Applet)或相关插件。以下是几种实现HTML中Jav…

    2026年5月10日
    000
  • php主要运用哪些东西

    PHP 是一种通用脚本语言,主要用于 Web 开发,包括创建动态网页、网站框架和内容管理系统。此外,它还支持 Web 服务(RESTful 和 SOAP)、数据库操作、命令行脚本、桌面应用程序和图像处理。 PHP 语言的主要应用 PHP(超文本预处理器)是一种广泛应用的通用脚本语言,主要用于 Web…

    2026年5月10日
    100
  • 静态重定位技术的优势与发展前景的研究

    探究静态重定位技术的优势与发展前景 技术的不断进步为我们带来了很多方便和效率,其中之一就是静态重定位技术。静态重定位技术是一种将程序加载到内存中的技术,通过修改程序中的地址,使其能够在不同的内存位置运行。本文将探究静态重定位技术的优势以及发展前景,并提供一些具体的代码示例作为参考。 静态重定位技术有…

    2025年12月24日
    500
  • 掌握网页性能受绘制和布局的影响

    了解重绘和回流对网页性能的影响,需要具体代码示例 简介:网页的性能是用户体验的关键因素之一。在优化网页性能的过程中,了解重绘和回流的概念及其对网页性能的影响非常重要。本文将详细讲解重绘和回流的含义,并举例说明它们对网页性能的影响。同时,提供一些优化的技巧和建议,以减少重绘和回流的次数,从而提升网页性…

    2025年12月24日
    300
  • 通过使用Web标准,提升网页性能与用户体验的方法

    随着互联网的快速发展,越来越多的企业和个人都开始关注网页的性能和用户体验。一方面,良好的网页性能可以提高网站的可访问性和搜索引擎排名,另一方面,优秀的用户体验可以增加用户的黏性和转化率。而借助Web标准来优化网页性能与用户体验,则成为现如今的一种主流方法。 那么,如何利用Web标准来优化网页性能与用…

    2025年12月24日
    300
  • CSS网页布局优化:提高网页加载速度和性能

    CSS 网页布局优化:提高网页加载速度和性能,需要具体代码示例 随着互联网的发展,用户对于网页加载速度和性能的要求越来越高。而对于网页开发者来说,优化网页布局是提高网页加载速度和性能的重要一环。在本文中,我们将分享一些实用的 CSS 优化技巧,并提供具体的代码示例。 选择合适的布局方式合适的布局方式…

    2025年12月24日
    300
  • 如何使用CSS3动画功能提升网页性能和用户体验

    如何使用CSS3动画功能提升网页性能和用户体验 在如今的互联网时代,网页设计已经成为了人们经常接触的一种艺术形式。而其中,动画效果在网页设计中起到了至关重要的作用,可以为用户呈现出更加生动、丰富的内容,提升用户的使用体验。然而,过多或不适当的动画效果也可能会给网页性能和用户体验带来负面影响。本文将介…

    2025年12月24日
    000
  • 提高css性能的方法

    这篇文章主要介绍了css性能优化提高css性能的方法,不规范的css会导致很多性能问题,所以学习掌握css性能优化技巧是非常必要的,对css性能优化知识感兴趣的朋友一起学习吧 不规范的css会导致很多性能问题,这些问题可能在一些小的项目中不够明显,但是在大型项目中就会显现出来。 css匹配原理 在优…

    用户投稿 2025年12月24日
    000
  • vscode运行html慢怎么办_解vscode运行html慢问题【技巧】

    使用Live Server插件启动本地服务器预览HTML,禁用非必要扩展以释放资源,优化大体积静态文件引入方式,清除浏览器缓存并切换至高性能浏览器,调整VSCode自动保存与文件监听设置,可显著提升加载速度。 如果您在使用VSCode运行HTML文件时发现加载或预览速度较慢,可能是由于插件配置、浏览…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信