0
朋友,我正在使用以下过程来移动表,每个表的索引,现在尝试在过程中包含dbms_stats.gather_table_stats。 不知怎的,无论我做什么收集统计不工作。在过程中包含表收集统计信息
请问有人可以建议我做错了什么?
过程接受两个参数OldTbs =旧的Tablespace和NewTbs =新的表空间。
逻辑我在追随; 环路
移动一个表中从表空间
移动在#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;
感谢贾斯汀的工作,相当长一段时间,我无法得到它的工作,所以最终决定得到专家的帮助。是的,我认为,因为我引用了复杂的东西。我有一个包含各种程序和使用包来移动对象的包,数据大小大于3TB。我也会将估算比例降低到10%左右。 – homer 2014-10-07 20:41:26
@homer - 你为什么首先将3TB的数据从一个表空间转移到另一个表空间?这似乎很可疑。根据你的Oracle版本,我建议让Oracle选择样本大小'dbms_stats.auto_sample_size'。不过,对于那么多的数据来说,除非统计数据一开始就是狡猾的,否则我只是将它们保存起来并在移动之后导入它们,而不是承担收集它们的所有成本。当然,我通常不会将表格移动到不同的表空间中。 – 2014-10-07 20:48:57
版本Oracle 11gR2,很棒.. auto_sample_size将会比,会为此手动读取。我只是按照要求对旧表空间进行清理。 – homer 2014-10-07 20:55:18