最近遇到的一个面试题,印象很深记录如下:
面试官:现在有一张表数据量达很大,要把里面记录时间的那行更新到当前最新日期,每次更新都很卡,机器变慢影响业务,怎么优化。
我的想法是:大量的数据更新肯定会写记录,而大量的写记录又会触发lgwr,所以机器变卡的原因是内存暂满还有在写重做日记。如果操作是添加日志组或增大日志的大小,又或者调整SGA里面各种池的大小,其实也是没有用,顶多就是延迟发生故障。
所以只要跳过写记录那块,那么问题就可以根本解决。
一般数据库都是在归档模式下运行(Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里),跳过就要关闭归档模式,还有就是修改表在nologging状态下。这样两个状态下就可以不写日志,但是也是在万分确定不会出错的情况下才能使用。
不过这样操作,数据库就要关闭重启到mount的状态,再关闭归档,这样在生产库是不允许的,而且关闭归档是影响整个数据库的,其他业务也会陷入无法恢复的境地,整个数据库无法使用rman做增量备份,很多备份方案都会受到限制。