首页 文章

Oracle是否有必要为具有新索引的新表收集表统计信息?

提问于
浏览
2

我刚刚在11gR2上创建了一个新表,并加载了没有索引的数据 . 加载完成后,我在新表上创建了几个索引,包括主要约束 .

CREATE TABLE xxxx (col1 varchar2(20), ...., coln varhcar2(10));
INSERT INTO xxxx SELECT * FROM another_table;
ALTER TABLE xxxx ADD CONSTRAINT xxxc PRIMARY KEY(col_list);
CREATE INDEX xxxx_idx1 ON xxxx (col3,col4);

此时我还需要使用DBMS_STATS.GATHER_TABLE_STATS(v_owner,'XXXX')来收集表统计信息吗?如果是,为什么?因为Oracle在文档中说“Oracle数据库现在可以在索引创建和重建期间自动收集统计信息” .

我不想等待自动统计数据收集过夜,因为我需要在上述操作后立即报告表的实际大小及其索引 . 我认为运行DBMS_STATS.GATHER_TABLE_STATS可能会给我一个更准确的使用数据 . 我可能错了 .

提前致谢,

1 回答

  • 4

    在Oracle 11gR2中,您仍需要收集表统计信息 . 我猜您读过Oracle 12c的文档,它自动收集统计信息,但仅用于直接路径插入,这不是您的情况,您的插入是常规的 . 此外,如果您收集尚未用于查询的全新表的统计信息(使用默认选项),则不会生成直方图 .

    构建索引时会收集索引统计信息,因此不需要显式收集其统计信息 . 稍后收集表统计信息时,应使用 DBMS_STATS.GATHER_TABLE_STATS 选项 cascade => false ,以便不会收集索引统计信息两次 .

    您只需使用查看统计信息即可

    SELECT * FROM ALL_TAB_COL_STATISTICS WHERE TABLE_NAME = 'XXXX';
    

相关问题