【发布时间】:2014-10-07 20:20:20
【问题描述】:
朋友们,我正在使用以下过程来移动表、每个表的索引,现在尝试在过程中包含 dbms_stats.gather_table_stats。 不知何故,无论我做什么收集统计数据都不起作用。
有人可以建议我做错了什么吗?
Procedure 接受两个参数 OldTbs = Old Tablespace 和 NewTbs = New Tablespace。
我遵循的逻辑; 循环
从表空间中移动一张表
将每个索引移动到 #1 中的表移动
- 收集 #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;
【问题讨论】:
标签: oracle procedures