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

记一次数据库优化

 
阅读更多

背景:电子政务系统显示公文数据列表打开的时候速度非常慢

 

原因:数据量大,多表之间连接复杂,打开列表需要读取的逻辑读超出12万,因为涉及到分页,所以需要查询俩次,一次是count出来的数据量(逻辑读=30000),用于分页,另一次是当前页显示的数据(逻辑读=90000),俩次查询涉及到的每张表都是全表扫描。

 

原sql语句太复杂,用这俩条语句做示例:

 

查询表的数据量
SELECT COUNT(DISTINCT NDOCID) FROM WF_DOC_GW;

查询当前页数据
SELECT *
  FROM (SELECT A.*, ROWNUM R
          FROM (SELECT DISTINCT NDOCID, TITLE, CREATEDATE
                  FROM WF_DOC_GW
                 ORDER BY CREATEDATE DESC) A
         WHERE ROWNUM <= 13) B
 WHERE R > 0;
 

 

 

解决思路:终极目标是降低逻辑读。为了这个目标,前进。

 

        1:每页显示13条数据,却要全表扫描几百万数据的表,如果能用索引来读取的话,该有多好啊。

        2:注意到查询当前页数据的时候,

             对CREATEDATE 进行了倒序排序,如果我们在count数据的时候,同时也对CREATEDATE进行倒序排序,

而且进行分页处理,得到当前页需要的ndocid,

       3:把第二步得到的ndocid传递到查询当前页数据的sql中,不就走索引了嘛(备注:ndocid是索引),按照这个想               法重新写sql

 

 

SELECT *
  FROM (SELECT A.*, ROWNUM R
          FROM (SELECT DISTINCT NDOCID,
                                CREATEDATE,
                                COUNT(DISTINCT A.NDOCID) OVER() AS COUNTNUM
                  FROM WF_DOC_GW
                 ORDER BY CREATEDATE DESC) A
         WHERE ROWNUM <= 13) B
 WHERE R > 0;
 

SELECT DISTINCT NDOCID, TITLE, CREATEDATE
  FROM WF_DOC_GW
 WHERE NDOCID IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
 ORDER BY CREATEDATE DESC;
 

 

 

 

 

结果:count数据里这条sql的逻辑读还是30000,但是查询当前页数据的sql逻辑读变为了300,从9万降低到300,性能提高很多

分享到:
评论

相关推荐

    oracle 数据库优化技术资料

    ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描. b. 通过ROWID访问表 你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)...

    如何实现数据库优化

    3. **限制结果集大小**:在满足业务需求的前提下,可以通过添加`TOP N`来限制返回的结果集大小,避免一次性加载大量数据,造成不必要的负载。 #### 合理使用索引 1. **正确放置索引**:在数据窗口使用SQL时,尽量...

    SqlSever2005.一千万条以上记录分页数据库优化经验总结

    通过存储上一页的最后一条记录的主键值,然后在下一次查询时使用`BETWEEN`来定位新页面的范围,从而避免了从头开始扫描所有数据。 另外,考虑使用`TOP-N`查询,结合`ORDER BY`对数据进行预排序,这样可以限制返回的...

    oracle数据库性能优化宝典

    7. **减少访问数据库的次数**:通过批量处理和合并多次操作为一次,可以显著减少网络往返时间和数据库负载。 8. **使用DECODE函数来减少处理时间**:DECODE函数可以简化逻辑,减少分支判断,提高执行效率。 9. **...

    使用JAVA内存数据库h2database性能优化

    【使用JAVA内存数据库h2database性能优化】 在开发应用程序时,我们经常遇到性能瓶颈,特别是当涉及到大量的IO操作时。数据库访问是这类问题的主要来源,特别是在处理高并发、实时计算和海量数据监控的情况下。例如...

    Oracle数据库SQL优化总结

    4. **减少数据库访问次数**:通过一次获取更多的数据,例如调整ARRAYSIZE参数,可以提高数据检索效率。 5. **使用DECODE函数**:DECODE函数能减少重复扫描和连接,提高处理速度。 6. **整合简单无关联的数据库访问...

    Oracle优化日记:一个金牌DBA的故事 第一部

    另外本书第一次详尽地披露了oracle数据库内部存储结构,并公布了部分代码,对于有兴趣研究数据库内部存储结构或者编写dul工具的读者有一定的参考价值。  本书适合oracle数据库管理开发人员阅读。

    mySQL数据库性能优化pdf.pdf

    在开发中,性能优化是一个非常重要且经常被考察的知识点,尤其是在面试中。特别是在涉及JavaEE技术栈的应用开发时,对MySQL数据库的性能优化更是面试中...记住,性能优化不是一次性的,而是需要持续关注和调整的过程。

    SQL数据库优化大总结之百万级数据库优化方案

    4. **减少数据库访问次数**:通过批量处理,例如增大ARRAYSIZE参数,可以一次性获取更多数据,降低数据库访问频率。 5. **利用DECODE函数**:DECODE函数可减少重复扫描或连接,提高处理速度。 6. **整合数据库访问...

    数据库的查询优化技术

    数据库查询优化是一项复杂的任务,需要根据具体情况进行细致的分析和调整。通过采用上述提到的一些最佳实践和技术,可以显著提高数据库查询的性能。此外,持续监控和调优也是保持数据库高效运行的重要手段。

    Oracle数据库优化大全

    Oracle通过一次读取多个数据块的方式来优化全表扫描过程。虽然这种方式适用于小表或在没有合适索引的情况下使用,但对大表来说效率较低。 2. **基于ROWID的访问**:ROWID是Oracle用来标识表中每行记录的唯一标识符...

    数据库优化定义.pdf

    SmOnceFetchCount控制一次从服务器取回的记录数,适当增加该值可以减少网络访问,但在大数据量场景下,查询速度可能因记录数过多而降低。SmOptimizeCount和SmOptimizeRatio用于全幅显示优化,需要根据实际数据和系统...

    sql数据库优化方法

    以下是一些常用的SQL数据库优化方法: 1. **系统优化介绍** 系统优化不仅涉及SQL语句的编写,还包括硬件配置、数据库参数调整、索引策略等多个方面。理解数据库的工作原理,根据实际业务需求进行针对性优化,能够...

    数据库优化实战利器.pdf

    主键索引是唯一且不可为空的,普通索引可重复且可以为空,唯一索引保证字段值唯一,但可以为空,并且只能出现一次。全文索引用于文本数据,它可以根据关键字搜索全文内容。 在索引优化过程中,还需要注意避免索引...

    数据库优化综合总结

    ### 数据库优化综合总结 #### 一、架构模型优化 1. **字段类型的选用:** 首选数字型而非字符型,例如避免使用`DECIMAL(4,0)`而应选择`INT(1)`。这有助于提升性能,因为数字类型的处理通常比字符串更快。 2. **...

Global site tag (gtag.js) - Google Analytics