或者:
call dbms_stats.gather_table_stats(user,'XPT_BANK_FENG');
call dbms_stats.gather_table_stats('FENG','TEM_TABLE');
SELECT TABLE_NAME, LAST_ANALYZED,a.*
FROM ALL_TAB_STATISTICS a WHERE A.OWNER = 'FENG';
执行后,查询截图:
2.3 实验 -更新 多个表的统计信息
sql复制代码
--编写函数,循环更新
create or replace function get_num_rows(p_tname varchar2) RETURN VARCHAR2 IS
vResult varchar2(2);
vFunctionName varchar2(1000);
vTableName varchar2(500);
vMsg varchar2(1000);
vCount number;
pDataIssue varchar2(7);
begin
vResult := '0';
pDataIssue := to_char(sysdate,'yyyy-mm');
vTableName := '' ; --'OPEN_CNT_ASSCON';
vFunctionName := 'get_num_rows -更新';
begin
GET_LOGGER(pDataIssue, 'get_num_rows', vTableName, '0', '开始跑批');
FOR t IN (SELECT table_name FROM user_tables t
WHERE t.table_name like 'SUN_PUBLIC_%'or t.table_name like '%RPT%'
)
LOOP
DBMS_STATS.GATHER_TABLE_STATS(
ownname => USER,
tabname => t.table_name,
cascade => TRUE
);
GET_LOGGER(pDataIssue, 'get_num_rows', t.table_name, '0', '结束');
END LOOP;
GET_LOGGER(pDataIssue, 'get_num_rows', '', '0', '结束跑批');
EXCEPTION
WHEN OTHERS THEN
vMsg := '报错位置:' || dbms_utility.format_error_backtrace || '报错信息:' ||
substr(SQLERRM, 1, 200);
GET_LOGGER(pDataIssue, vFunctionName, vTableName, '3', vMsg);
vResult := '1';
END;
return vResult;
end;
查询更新后的统计信息:
sql复制代码
select T.table_name,T.num_rows from user_tables t
where t.table_name like 'SUN_PUBLIC_%'
or t.table_name like '%RPT%'
ORDER BY 1
2.4 查看 数据表上次统计更新的时间
sql复制代码
--查看上次统计信息更新的时间
SELECT TABLE_NAME, LAST_ANALYZED,a.*
FROM ALL_TAB_STATISTICS a WHERE A.OWNER = 'FENG';
2.5 自动化脚本更新
sql复制代码
--将如下两个脚本存放到同一目录下,注意修改数据库配置参数,然后使用windows计划任务定期执行动态更新;
--来源 https://blog.51cto.com/u_14286115/3327958,未验证,应该是可以的。
脚本1:自动更新Oracle统计信息.bat
title 自动更新Oracle统计信息[%date%%time%]
sqlplus userName/passWord@192.168.0.1/db_name @gen_sqls.sql | find "call dbms_stats.gather_table_stats">stats_sqls.sql
echo exit>>stats_sqls.sql
sqlplus userName/passWord@192.168.0.1/db_name @stats_sqls.sql
echo 脚本执行完成
脚本2:gen_sqls.sql
select
'call dbms_stats.gather_table_stats(''用户名'','''|| TABLE_NAME ||''');' as sqls
from user_tables a
where a.last_analyzed <sysdate-7
and num_rows > 1000
order by num_rows ;
exit;