朋友们,我正在使用以下过程来移动每个表的表,索引,现在尝试在过程中包含dbms_stats.gather_table_stats。 无论如何我收集的数据不起作用。
有人可以建议我做错了吗?
过程接受两个参数OldTbs = Old Tablespace和NewTbs = New Tablespace。
逻辑我在追随; 环
从表空间移动一个表
在#1
直到#2工作,现在尝试在表完成所有索引重建后包含dbms_stats。 用户有权移动任何架构。
dmbs_stats.gather_table_stats(owner=>.......)
CREATE OR REPLACE PROCEDURE moveTbl (OldTbs in varchar2, NewTbs in varchar2)
AUTHID CURRENT USER
IS
CURSOR curTable IS
SELECT owner, table_name, tablespace_name
FROM dba_tables
WHERE tablespace_name = OldTbs
ORDER BY TABLE_NAME;
CURSOR curIndex (lTabOwn IN Varchar2, lTabNan IN Varchar2) IS
SELECT table_owner, table_name, owner, index_name, tablespace_name
FROM dba_indexes
WHERE table_owner = lTabOwn
AND table_name = lTabNam;
BEGIN
FOR rec1 IN curTable LOOP
dbms_output.putline(rec1.owner || '.' || rec1.table_name);
EXECUTE IMMEDIATE 'alter table ' || rec1.owner || '.' || rec1.table_name ||
' move tablespace ' || NewTbs;
FOR rec2 IN curIndex LOOP
.....
.....
.....
END LOOP; --curIndex for loop
dmbs_stats.gather_table_stats(ownname=>'''||rec1.owner || ''',tabname=> || rec1.table_name ||''', estimate_percent=>100, cascade=>true);
END LOOP; --curTable for loop
END moveTbl;
答案 0 :(得分:2)
只需将所有者和表名作为参数传递即可。您没有构建动态SQL语句,因此没有理由引用任何内容
dbms_stats.gather_table_stats( ownname => rec1.owner,
tabname => rec1.table_name,
estimate_percentage => 100,
cascade => true );
当然,这并不会影响您正在编写的代码的基本智慧。如果您经常将对象从一个表空间移动到另一个表空间,以至于值得编写存储过程,我会强烈怀疑您做错了什么。除非你有大量的数据或非常奇怪的数据模式,估计百分比100似乎也是严重的过度杀伤。