Oracle 锁定临时表统计信息

  全局临时表的统计信息是不能被收集的,如果被收集,它的统计信息肯定为0,会造成执行计划不准,所以要锁定它的统计信息,禁止系统自动收集。

--先解锁表的统计信息,然后删除表的统计信息,最后锁住表的统计信息

declare

  v_sql varchar2(500);

  cursor rowList1 is

   select‘begin dbms_stats.unlock_table_stats(user,‘‘‘ || table_name || ‘‘‘); end;‘

     from user_tables s

   where s.temporary = ‘Y‘

  cursor rowList2 is

   select‘begin dbms_stats.delete_table_stats(user,‘‘‘ || table_name || ‘‘‘); end;‘

     from user_tables s

   where s.temporary = ‘Y‘;

  cursor rowList3 is

   select‘begin dbms_stats.lock_table_stats(user,‘‘‘ || table_name || ‘‘‘); end;‘

     from user_tables s

   where s.temporary = ‘Y‘;  

begin

  open rowList1;

  open rowList2;

  open rowList3;

  loop

    fetch rowList1  into v_sql;

       executeimmediate v_sql;

    exitwhen rowList1%notfound;

  endloop;

  loop

    fetch rowList2  into v_sql;

       executeimmediate v_sql;

    exitwhen rowList2%notfound;

  endloop;

  loop

    fetch rowList3  into v_sql;

       executeimmediate v_sql;

    exitwhen rowList3%notfound;

  endloop;   

  close rowList1;

  close rowList2;

  close rowList3;

end;

-- STATTYPE_LOCKED=‘ALL‘意思是表的统计信息被锁

select s.table_name,s.STATTYPE_LOCKEDfrom user_TAB_STATISTICS s  where s.STATTYPE_LOCKED=‘ALL‘;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。