在实践中ORACLE数据库SQL逻辑读(即逻辑读大小)高会引发性能问题。

      通常相关指标为平均单次执行逻辑读不得大于2000。

逻辑读(Logical Reads)

     概念1:逻辑读指ORACLE从内存读到的数据块数量。一般来说, logical reads = db block gets + consistent gets

      概念2:逻辑读指的就是从Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为当前模式读(Current Read)和一致性读(Consistent Read)。 

      这两个概念本质是一样的,只是措辞不一样。

     逻辑读的单位为数据库块,默认大小为8KB。

     通过逻辑读可以计算出数据读取量。比如,SQL单次逻辑读为1024,那么,其数据读取量则为1024 * 8KB=8MB。

     SQL语句不得逻辑读高,SQL语句逻辑读高很多情况下会出现性能问题,逻辑读高会引发数据库CPU资源使用率上升。产生高逻辑读的原因有:未创建索引、索引设计不佳、SQL语句写法存在问题等。

解决方案:

1、确认数据库参数是否设置合理。Sga、db_cache_size。

2、分析SQL语句,优化SQL,创建合适的索引。

3、存在索引的情况,确认谓词覆盖的范围。覆盖条件大,造成索引覆盖较多的range、fast full scan等查询计划,均可能造成逻辑读高。

查看逻辑读前10的SQL:

代码如下: 
set linesize 300;
set pagesize 300;
set long 50000;
SELECT *
FROM (
SELECT sql_fulltext AS sql, SQL_ID,buffer_gets / executions AS "Gets/Exec",buffer_gets, executions
FROM V$SQLAREA
WHERE buffer_gets > 10000
ORDER BY "Gets/Exec" DESC
)
WHERE rownum <= 10;

更多内容请关注公众号“测试小号等闲之辈”~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐