在实践中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;
更多内容请关注公众号“测试小号等闲之辈”~