我们在做完数据迁移后,必须先更新统计信息,才可以接入业务系统,否则语句执行效率可能很低。
下面是更新统计信息的方式:
sf_set_SESSION_para_value('HAGR_HASH_SIZE',10000000);
sf_set_SESSION_para_value('HAGR_BUF_SIZE',15000);
--上面两个语句,如果执行报错的话,可以不执行,跳过这两个sp_set的设置即可。
select 'DBMS_STATS.GATHER_SCHEMA_STATS('''||username||''',100,TRUE,''FOR ALL COLUMNS SIZE AUTO'');'
from all_users;
--这里我们一般选择需要收集的用户对应的行,进行执行即可。
我们也可以直接执行下面的语句(学习意义大于实际意义):
begin
for rs in (select 'sf_set_SESSION_para_value(''HAGR_HASH_SIZE'',(select cast(
case when max(table_rowcount(owner,table_name))<=(select max_value from v$dm_ini
where para_Name=''HAGR_HASH_SIZE'') and max(table_rowcount(owner,table_name))>=(
select min_value from v$dm_ini where para_Name=''HAGR_HASH_SIZE'') then
max(table_rowcount(owner,table_name)) when max(table_rowcount(owner,table_name))<(
select min_value from v$dm_ini where para_Name=''HAGR_HASH_SIZE'') then
(select min_value from v$dm_ini where para_Name=''HAGR_HASH_SIZE'') else
(select max_value from v$dm_ini where para_Name=''HAGR_HASH_SIZE'') end as bigint)
from dba_tables where owner='''||NAME||'''));'
sql1,'DBMS_STATS.GATHER_SCHEMA_STATS('''||NAME||''',100,TRUE,''FOR ALL COLUMNS SIZE AUTO'');'
sql2
from SYS.SYSOBJECTS where TYPE$='SCH' ) loop
execute immediate rs.sql1;
execute immediate rs.sql2;
end loop;
end;
/
文章
阅读量
获赞