今天在检查刚接手的DB的AWR报告时发现一个SQL Gets很大,于是进行tunning,看了一眼user_tables,发现这个表的last_analyzed居然是2007年的,很奇怪,这个表应该是在不断的进行修改,并且,数据库是Oracle 10g,自动收集统计信息的任务也没有关闭,为什么没有更新统计信息呢?
查看dba_tab_modification表,也没有发现任何有关于这个表的记录,奇了
不管他,直接收集统计信息,这下发现问题了
SQL> exec dbms_stats.gather_table_stats(user,'XXX',method_opt => 'for all indexed columns',cascade => true,degree => 2);
begin dbms_stats.gather_table_stats(user,'XXX',method_opt => 'for all indexed columns',cascade => true,degree => 2); end;
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 13056
ORA-06512: at "SYS.DBMS_STATS", line 13076
ORA-06512: at line 2
统计信息不知道被谁给锁了。汗
解锁,收集统计信息
SQL> exec dbms_stats.unlock_table_stats(user,'XXX');
PL/SQL procedure successfully completed
SQL> exec dbms_stats.gather_table_stats(user,'XXX',method_opt => 'for all indexed columns',cascade => true,degree => 2);
PL/SQL procedure successfully completed
一般来讲,没有正式系统会lock statistics的,不知道这个服务器为啥进行了lock,而且,因为这个原因导致了很大的性能问题。
可以查看select table_name,stattype_locked from user_tab_statistics
为啥Oracle不把这个字段加到user_tables里呢?这种情况看来还真的比较少,很少有人查这个,再汗一个