背景:电子政务系统显示公文数据列表打开的时候速度非常慢
原因:数据量大,多表之间连接复杂,打开列表需要读取的逻辑读超出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采用一次读入多个数据块(database block)的方式优化全表扫描. b. 通过ROWID访问表 你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)...
3. **限制结果集大小**:在满足业务需求的前提下,可以通过添加`TOP N`来限制返回的结果集大小,避免一次性加载大量数据,造成不必要的负载。 #### 合理使用索引 1. **正确放置索引**:在数据窗口使用SQL时,尽量...
通过存储上一页的最后一条记录的主键值,然后在下一次查询时使用`BETWEEN`来定位新页面的范围,从而避免了从头开始扫描所有数据。 另外,考虑使用`TOP-N`查询,结合`ORDER BY`对数据进行预排序,这样可以限制返回的...
7. **减少访问数据库的次数**:通过批量处理和合并多次操作为一次,可以显著减少网络往返时间和数据库负载。 8. **使用DECODE函数来减少处理时间**:DECODE函数可以简化逻辑,减少分支判断,提高执行效率。 9. **...
【使用JAVA内存数据库h2database性能优化】 在开发应用程序时,我们经常遇到性能瓶颈,特别是当涉及到大量的IO操作时。数据库访问是这类问题的主要来源,特别是在处理高并发、实时计算和海量数据监控的情况下。例如...
4. **减少数据库访问次数**:通过一次获取更多的数据,例如调整ARRAYSIZE参数,可以提高数据检索效率。 5. **使用DECODE函数**:DECODE函数能减少重复扫描和连接,提高处理速度。 6. **整合简单无关联的数据库访问...
另外本书第一次详尽地披露了oracle数据库内部存储结构,并公布了部分代码,对于有兴趣研究数据库内部存储结构或者编写dul工具的读者有一定的参考价值。 本书适合oracle数据库管理开发人员阅读。
在开发中,性能优化是一个非常重要且经常被考察的知识点,尤其是在面试中。特别是在涉及JavaEE技术栈的应用开发时,对MySQL数据库的性能优化更是面试中...记住,性能优化不是一次性的,而是需要持续关注和调整的过程。
4. **减少数据库访问次数**:通过批量处理,例如增大ARRAYSIZE参数,可以一次性获取更多数据,降低数据库访问频率。 5. **利用DECODE函数**:DECODE函数可减少重复扫描或连接,提高处理速度。 6. **整合数据库访问...
数据库查询优化是一项复杂的任务,需要根据具体情况进行细致的分析和调整。通过采用上述提到的一些最佳实践和技术,可以显著提高数据库查询的性能。此外,持续监控和调优也是保持数据库高效运行的重要手段。
Oracle通过一次读取多个数据块的方式来优化全表扫描过程。虽然这种方式适用于小表或在没有合适索引的情况下使用,但对大表来说效率较低。 2. **基于ROWID的访问**:ROWID是Oracle用来标识表中每行记录的唯一标识符...
SmOnceFetchCount控制一次从服务器取回的记录数,适当增加该值可以减少网络访问,但在大数据量场景下,查询速度可能因记录数过多而降低。SmOptimizeCount和SmOptimizeRatio用于全幅显示优化,需要根据实际数据和系统...
以下是一些常用的SQL数据库优化方法: 1. **系统优化介绍** 系统优化不仅涉及SQL语句的编写,还包括硬件配置、数据库参数调整、索引策略等多个方面。理解数据库的工作原理,根据实际业务需求进行针对性优化,能够...
主键索引是唯一且不可为空的,普通索引可重复且可以为空,唯一索引保证字段值唯一,但可以为空,并且只能出现一次。全文索引用于文本数据,它可以根据关键字搜索全文内容。 在索引优化过程中,还需要注意避免索引...
### 数据库优化综合总结 #### 一、架构模型优化 1. **字段类型的选用:** 首选数字型而非字符型,例如避免使用`DECIMAL(4,0)`而应选择`INT(1)`。这有助于提升性能,因为数字类型的处理通常比字符串更快。 2. **...