刍议oracle数据库sql逻辑读高性能问题

在实践中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;

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