`
yufeng0471
  • 浏览: 101056 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

逻辑读低,性能低的一次优化

 
阅读更多

背景:维护反映客户现场的一个页面打开的速度非常慢,把该功能执行的sql语句输出到日志文件导回本地。

 

现象:

 

  • 在本地执行非常快,查看执行计划,有五张表是全表扫描。
  • 在客户现场查看执行,有七张表是全表扫描,逻辑读是9000多,执行时间为5秒左右,下面是客户现场的执行计划。
------------------------------------------------------------------------------
| Id  | Operation                           | A-Rows |   A-Time   | Buffers | 
----------------------------------------------------------------------------- 
|   1 |  SORT GROUP BY                      |      1 |00:00:05.05 |    9154 | 
|*  2 |   FILTER                            |  10060 |00:00:05.17 |    9154 | 
|*  3 |    HASH JOIN                        |  60710 |00:00:05.11 |    9072 | 
|*  4 |     FILTER                          |  60710 |00:00:05.15 |    5558 | 
|*  5 |      HASH JOIN OUTER                |  61672 |00:00:05.03 |    5558 | 
|*  6 |       HASH JOIN                     |  61672 |00:00:06.92 |    3166 | 
|   7 |        MERGE JOIN CARTESIAN         |   4368 |00:00:00.03 |      18 | 
|   8 |         MERGE JOIN CARTESIAN        |    728 |00:00:00.01 |      16 | 
|   9 |          TABLE ACCESS BY INDEX ROWID|     28 |00:00:00.01 |       3 | 
|* 10 |           INDEX RANGE SCAN          |     28 |00:00:00.01 |       2 | 
|  11 |          BUFFER SORT                |    728 |00:00:00.01 |      13 | 
|  12 |           VIEW                      |     26 |00:00:00.01 |      13 | 
|  13 |            UNION-ALL                |     26 |00:00:00.01 |      13 | 
|* 14 |             TABLE ACCESS FULL       |      0 |00:00:00.01 |       3 | 
|* 15 |             FILTER                  |     26 |00:00:00.01 |      10 | 
|  16 |              TABLE ACCESS FULL      |     26 |00:00:00.01 |       7 | 
|* 17 |              TABLE ACCESS FULL      |      0 |00:00:00.01 |       3 | 
|  18 |         BUFFER SORT                 |   4368 |00:00:00.01 |       2 | 
|* 19 |          TABLE ACCESS BY INDEX ROWID|      6 |00:00:00.01 |       2 | 
|* 20 |           INDEX RANGE SCAN          |      9 |00:00:00.01 |       1 | 
|* 21 |        TABLE ACCESS FULL            |  55658 |00:00:00.11 |    3148 | 
|  22 |       TABLE ACCESS FULL             |    183K|00:00:00.18 |    2392 | 
|  23 |     TABLE ACCESS FULL               |    144K|00:00:00.14 |    3514 | 
|* 24 |    TABLE ACCESS FULL                |     17 |00:00:00.01 |      82 | 
------------------------------------------------------------------------------


 

 解决办法:

 

  • 通过加hits,建议数据库用索引来访问数据(注意:只是建议,数据库有权拒绝)。
  • 执行时间由5秒降到了0.5秒,这不是重点,让人惊讶的是逻辑读由9000上升到了15000,为什么会这样?逻辑读增加了1.5倍,执行时间却降到了原来的1/10,这是以前没遇到过的现象。

 

下面是加了hits之后的执行计划

 

------------------------------------------------------------------------------
| Id  | Operation                            | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------
|   1 |  SORT GROUP BY                       |      1 |00:00:00.53 |   14946 |
|*  2 |   FILTER                             |  10060 |00:00:01.03 |   14946 |
|   3 |    MERGE JOIN CARTESIAN              |  60710 |00:00:03.04 |   14864 |
|*  4 |     FILTER                           |   2335 |00:00:01.44 |   14851 |
|   5 |      NESTED LOOPS OUTER              |   2372 |00:00:00.29 |   14851 |
|   6 |       NESTED LOOPS                   |   2372 |00:00:00.21 |    7899 |
|*  7 |        HASH JOIN                     |   2372 |00:00:00.16 |    3153 |
|   8 |         MERGE JOIN CARTESIAN         |    168 |00:00:00.01 |       5 |
|   9 |          TABLE ACCESS BY INDEX ROWID |     28 |00:00:00.01 |       3 |
|* 10 |           INDEX RANGE SCAN           |     28 |00:00:00.01 |       2 |
|  11 |          BUFFER SORT                 |    168 |00:00:00.01 |       2 |
|* 12 |           TABLE ACCESS BY INDEX ROWID|      6 |00:00:00.01 |       2 |
|* 13 |            INDEX RANGE SCAN          |      9 |00:00:00.01 |       1 |
|* 14 |         TABLE ACCESS FULL            |  55897 |00:00:00.11 |    3148 |
|  15 |        TABLE ACCESS BY INDEX ROWID   |   2372 |00:00:00.04 |    4746 |
|* 16 |         INDEX UNIQUE SCAN            |   2372 |00:00:00.02 |    2374 |
|  17 |       TABLE ACCESS BY INDEX ROWID    |   2036 |00:00:00.06 |    6952 |
|* 18 |        INDEX RANGE SCAN              |   2036 |00:00:00.02 |    4748 |
|  19 |     BUFFER SORT                      |  60710 |00:00:00.07 |      13 |
|  20 |      VIEW                            |     26 |00:00:00.01 |      13 |
|  21 |       UNION-ALL                      |     26 |00:00:00.01 |      13 |
|* 22 |        TABLE ACCESS FULL             |      0 |00:00:00.01 |       3 |
|* 23 |        FILTER                        |     26 |00:00:00.01 |      10 |
|  24 |         TABLE ACCESS FULL            |     26 |00:00:00.01 |       7 |
|* 25 |         TABLE ACCESS FULL            |      0 |00:00:00.01 |       3 |
|* 26 |    TABLE ACCESS FULL                 |     17 |00:00:00.01 |      82 |
------------------------------------------------------------------------------


 

 

通过观察这俩个执行计划,发现未加hits的时候,HASH JOIN 后的行数是61672行,加了hits之后,HASH JOIN 后的行数是2372行,而且HASH JOIN 的时间也大大缩短,由此推断,

虽然没加hits之前,逻辑读少,但是产生的中间数据太多,消耗内存和cpu,而加了hits之后,虽然逻辑读多了1.5倍,但产生的中间数据却少了很多,既节省内存,又节省cpu。这也给我提供了一个新的优化sql思路,并不像一些博文说的,优化的终极目标就是降低逻辑读,除此之外,还要关注sql执行的中间过程。

 

分享到:
评论

相关推荐

    性能优化PPT.pdf

    性能优化并非一次性工作,而是一个持续的过程。以下是一些基本步骤: ##### 3.1 分析现有系统 - **性能测试**: 使用工具如LoadRunner、JMeter等进行压力测试,找出瓶颈所在。 - **日志分析**: 通过分析系统日志来...

    SQL 性能优化工具

    SQL性能优化是一个重要的主题,尤其是在使用像SQL Server 2000这样的早期版本时,由于资源有限,优化显得更为关键。本系列课程主要关注通过理解并应用锁和事务管理来提升SQL查询的效率。 首先,我们要了解【锁和锁...

    SQLSERVER性能优化综述

    性能优化不是一次性任务,而是持续的过程。随着业务发展和数据增长,需要不断评估和改进系统性能,确保系统的健壮性和响应速度。 总之,SQLSERVER的性能优化涵盖了系统设计、开发、运维等多个环节,需要全面考虑...

    asp.net网站性能优化

    2. **DataGrid控件优化**:DataGrid控件在展示大量数据时,应启用分页功能,只在用户请求时加载当前页数据,避免一次性加载所有记录,从而减少服务器负载。 3. **垃圾回收机制**:理解.NET Framework中的垃圾回收...

    ABAP程序性能优化

    1. **优化`READ_TEXT`等函数模块**:如果在循环中频繁调用标准函数模块,考虑将其拆分为两部分:一部分用于一次性加载数据,另一部分处理业务逻辑。这可以显著减少每次循环中的数据加载时间。 #### 五、良好的ABAP...

    J2EE程序的性能优化技巧

    2. 合并I/O操作:尽量减少I/O调用,例如一次读取或写入大量数据,而不是多次小规模操作。 3. 使用NIO(非阻塞I/O):在处理大量并发连接时,NIO能提供更好的性能。 四、Servlet Servlet是J2EE中的核心组件,优化其...

    mybatis一对多性能优化demo

    2. **联合查询(Eager Fetching)**:通过`<select>`标签的`useCache="true"`和`@ResultMap`注解,我们可以执行一次嵌套查询,一次性获取User和其关联的Orders。这种方式减少了数据库访问次数,但增加了单条SQL的...

    uni-app:从运行原理上面解决性能优化问题

    【uni-app】是一款多端开发框架,它允许开发者编写一次代码,就能运行在iOS、Android、Web等不同平台上。然而,由于其非原生的特性,可能会遇到性能问题,这在React Native、Flutter等框架中也同样存在。本文将探讨...

    J2EE性能优化.

    在J2EE(Java 2 Platform, Enterprise Edition)应用程序开发中,性能优化是至关重要的一个环节,它关乎到系统...每一次优化都应以不影响系统稳定性和可维护性为前提,确保性能提升的同时,系统的整体质量也得到提升。

    .net服务器端性能优化

    1. **列表数据分页处理**:避免一次性加载大量数据,通过分页机制提高响应速度。 2. **缓存加速**:缓存常用数据,减少数据库访问次数,提高响应速度。 3. **缓存一致性维护**:根据数据变更频率和业务一致性要求...

    Oracle查看逻辑读、物理读资源占用排行的SQL语句

    总的来说,监控和优化逻辑读与物理读是Oracle数据库性能调优的重要环节。通过上述SQL语句,我们可以有效地定位高消耗资源的SQL,从而有针对性地进行性能优化工作,确保数据库系统的高效运行。在日常运维中,定期执行...

    常用的后端性能优化六种方式:缓存化+服务化+异步化等

    这个时候我们可以通过产品逻辑的方式来优化,比如,在用户点击查询之后将“按钮置灰”,或者通过 JS 控制 xx 秒只能只能提交一次请求等,有效的拦截了 80% 的无效流量。 四、服务化 服务化是将系统拆分成多个独立...

    orale性能优化word文档

    2. **使用绑定变量**:绑定变量可以减少解析开销,避免硬解析,因为相同的SQL语句只需解析一次,后续的执行将复用解析计划。 3. **避免在WHERE子句中使用函数**:函数会阻止索引的使用,可能导致全表扫描。如果必须...

    Javascript 性能优化的一点技巧

    ### JavaScript性能优化技巧详解 #### 引言 随着Web应用的日益复杂,JavaScript作为前端开发的核心语言之一,其运行效率直接影响着用户体验与整体性能。因此,掌握一定的JavaScript性能优化技巧对于提升应用程序...

    程序设计性能优化经验总结

    例如,尽量避免使用如“From TableName”这样的无条件查询,这可能导致一次性加载大量数据,特别是当存在Clob类型的大数据时,可能会引发内存溢出的风险。 内存溢出分为缓慢溢出和快速溢出,主要由内存分配不合理或...

    drools语法参考和性能优化技巧

    - **无状态知识会话**:这类会话类似于函数调用,接受输入数据并返回处理后的结果,适用于一次性处理任务。 - 示例用例: - 校验:例如判断一个人是否有资格申请抵押贷款。 - 计算:例如计算抵押贷款的保费。 - ...

    前端性能优化指南

    ### 前端性能优化指南 #### 概述 前端性能优化是指通过对网站或Web应用的前端部分进行改进,以提升用户体验的过程。优秀的前端性能优化能够显著提高网页加载速度、减少资源消耗、增强用户交互体验,进而提升整体的...

Global site tag (gtag.js) - Google Analytics