目前,oracle数据库版本已经到达12C了,数据库SQL的执行基本都是基于CBO开销模式的。但是,对于应用维护人员不尽理解数据库的工作原理,他们为了最求数据库的高性能,创建完数据库,却禁用了数据库统计信息自动更新的JOB。在联通,通过如下方法查看,发现很多数据库的统计信息更新作业都被禁用了。
SQL> select owner,job_name,enabled from dba_scheduler_jobs where job_name='GATHER_STATS_JOB';
OWNER JOB_NAME ENABL
------------------------------ ------------------------------ -----
SYS GATHER_STATS_JOB FALSE
这样,虽然能暂时换来数据库的高性能,但是这并不是应用最求应用系统最好性能的根本方法。反而,他们关闭了数据库统计信息自动更新任务,却又忘记关注数据库对象的统计信息,更容易导致锁表、全表扫描、表的高水位问题。因为,数据库对象的统计信息不再自动更新,SQL执行失去了CBO开销模式评估的最有效的信息,导致SQL执行发生一系列的问题。今天,ERP项目管理就发现一个奇特的问题:表只有143M,使用select进行记录数统计时执行20多分钟没有结果,却被数据库强制断开了连接;在综合网管系统中发现很多ORA-01555的报错,找到一个SQL执行老失败,查看SQL涉及的表的统计信息也是2年前的,再一看数据库的对象统计信息自动更新任务也是被禁用了的。
其实,如果想从统计信息平衡应用的好性能,可以人为的做个crontab,人为判断数据库空闲时间,开启数据库统计信息更新功能,执行数据库统计信息更新。在其他的时间段可以暂时停止该任务的执行。