遇到了DBA给的逻辑读过大告警邮件,
整理了下一些相关概念,记录一下(数据库是oracle)
从磁盘读取数据块到内存的操作叫物理读,当Buffer Cache里面不存在这些数据块时,就会产生物理读,像全表扫描、磁盘排序等操作也可能产生物理读。
(Buffer Cache是SGA区中专门用于存放从数据文件中读取的的数据块拷贝的区域,相当于内存中的数据缓存,且Buffer cache对于所有oracle进程都是共享的。)
逻辑读指的就是从Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为当前模式读(Current Read)和一致性读(Consistent Read)。
ORACLE是一个多用户系统。当一个会话开始读取数据还未结束读取之前,可能会有其他会话修改了它将要读取的数据。如果会话读取到修改后的数据,就会造成数据的不一致。一致性读就是为了保证数据的一致性。在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN。如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为“脏”数据。当其他进程读取数据块时,会先比较数据块上的SCN和进程自己的SCN。如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。通常,普通查询都是一致性读。
(SCN(System Change Number 简称 SCN)是当Oracle数据库有更新后,由DBMS自动维护去累积递增的一个数字。有四种SCN,分别为:系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN。)
当前模式读(db block gets)即读取数据块是当前的最新数据。任何时候在Buffer Cache中都只有一份当前数据块。当前读通常发生在对数据进行修改、删除操作时。这时,进程会给数据加上行级锁,并且标识数据为“脏”数据。
逻辑读过大 会导致CPU使用率过高,影响数据库及对应服务器性能。