工作中同事反馈有一套oracle 11g的数据库,统计表的行数为空,但表中是有数据的。我问他要了统计用的查询语句。
select a.num_rows, a.* from dba_tables awhere a.owner='NEWODS'
同事查询出的结果如下:

同时同事也反映,如果对单表执行 analyze 之后,num_rows 数据也能出来,问有没有全局执行的方法,不然要一个表一个表的执行。同事也给出了单表执行的语句。
alayze table tablename compute statistics;
实际上他已经把问题找到了,问题出在数据库没有收集统计信息。
如果想立即生效,可以手动收集统计信息
SQL> BEGINdbms_stats.gather_database_stats();END;/

整个过程执行了近一个小时,执行完成后检查数据库对象的last_analyzed时间。
SQL> select table_name,num_rows,last_analyzedfrom dba_tableswhere owner='NEWODS';

时间已经更新,说明收集统计信息生效。
因为收集统计信息比较耗时,如果想让其自动运行。可以启用oracle的自动优化任务。
首先查看自动优化任务是否开启
SELECT client_name, status FROM dba_autotask_client;

如果没有开启,使用语句开启自动优化
BEGINDBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);END;/

查看具体的执行计划
select WINDOW_NAME,WINDOW_NEXT_TIME ,WINDOW_ACTIVE,OPTIMIZER_STATSfrom DBA_AUTOTASK_WINDOW_CLIENTSorder by WINDOW_NEXT_TIME ;

查执行频率和间隔
COL REPEAT_INTERVAL FOR A53COL DURATION FOR A13select w.window_name,w.repeat_interval,w.duration,w.enabledfrom dba_autotask_window_clients c,dba_scheduler_windows wwhere c.window_name = w.window_nameand c.optimizer_stats = 'ENABLED';

做完这些之后就是等任务按照计划执行,对于执行的历史可以通过以下语句查询:
SELECT client_name,window_name,jobs_created,jobs_started,jobs_completedFROM dba_autotask_client_history;
最后修改时间:2024-09-26 08:25:06
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




