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

Oracle是否需要为具有新索引的新表收集表统计信息?,oracle,oracle11g,Oracle,Oracle11g,我刚刚在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

我刚刚在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_STATSv_owner,'XXXX'来收集表的统计信息吗? 若有,原因为何?由于Oracle在文档中说,Oracle数据库现在在索引创建和重建期间自动收集统计数据

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


提前感谢,

在Oracle 11gR2中,您仍然需要收集表统计信息。我猜您已经阅读了Oracle 12c的文档,它会自动收集统计信息,但只收集直接路径插入的统计信息,这不是您的情况,您的插入是传统的。此外,如果您使用默认选项为尚未用于查询的全新表收集统计信息,则不会生成直方图

索引统计信息是在构建索引时收集的,因此不需要显式收集其统计信息。稍后收集表统计信息时,应使用DBMS_STATS.gather_table_STATS选项cascade=>false,这样索引统计信息不会收集两次

您只需使用

SELECT * FROM ALL_TAB_COL_STATISTICS WHERE TABLE_NAME = 'XXXX';

嗨,Husqvik,谢谢你的快速回复。如果我不运行表统计,我可以得到准确的空间使用大小吗?当然,只要检查这个线程-明白了。如果不运行DBMS_STATS.GATHER_TABLE_STATS,则所有_TAB_COL_统计信息都为空。再次感谢。对于桌子的大小,您不需要任何统计数据。只需从USER_SEGMENTS中选择BYTES、SEGMENTS_NAME。