暂无图片
暂无图片
10
暂无图片
暂无图片
暂无图片

Oracle 手动收集统计信息

生有可恋 2021-11-11
7594

工作中同事反馈有一套oracle 11g的数据库,统计表的行数为空,但表中是有数据的。我问他要了统计用的查询语句。

select a.num_rows, a.* from dba_tables a 
where a.owner='NEWODS'

同事查询出的结果如下:



同时同事也反映,如果对单表执行 analyze 之后,num_rows 数据也能出来,问有没有全局执行的方法,不然要一个表一个表的执行。同事也给出了单表执行的语句。

alayze table tablename compute statistics;

实际上他已经把问题找到了,问题出在数据库没有收集统计信息。


如果想立即生效,可以手动收集统计信息

SQL> BEGIN
dbms_stats.gather_database_stats();
END;
/


整个过程执行了近一个小时,执行完成后检查数据库对象的last_analyzed时间。

SQL> select table_name, 
            num_rows, 
last_analyzed
     from dba_tables  
     where owner='NEWODS';


时间已经更新,说明收集统计信息生效。


因为收集统计信息比较耗时,如果想让其自动运行。可以启用oracle的自动优化任务。


首先查看自动优化任务是否开启

SELECT client_name, status FROM dba_autotask_client;


如果没有开启,使用语句开启自动优化

BEGIN
DBMS_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_STATS 
from DBA_AUTOTASK_WINDOW_CLIENTS
order by WINDOW_NEXT_TIME ;


查执行频率和间隔

COL REPEAT_INTERVAL FOR A53
COL DURATION FOR A13


select w.window_name,
w.repeat_interval,
w.duration,
w.enabled
from dba_autotask_window_clients c,
dba_scheduler_windows w
where c.window_name = w.window_name
and c.optimizer_stats = 'ENABLED';


做完这些之后就是等任务按照计划执行,对于执行的历史可以通过以下语句查询:

SELECT client_name, 
       window_name, 
       jobs_created, 
       jobs_started, 
jobs_completed
FROM dba_autotask_client_history;
最后修改时间:2024-09-26 08:25:06
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论