【问题标题】:Oracle Is it necessary to gather table stats for a new table with new index?Oracle 是否有必要为具有新索引的新表收集表统计信息?
【发布时间】:2015-09-20 21:48:17
【问题描述】:

我刚刚在 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 可能会给我更准确的使用数据。不过我可能是错的。

提前致谢,

【问题讨论】:

  • 对于表的大小,您不需要任何统计信息。只需select BYTES, SEGMENT_NAME from USER_SEGMENTS

标签: oracle oracle11g


【解决方案1】:

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

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

您可以使用

简单地检查统计信息
SELECT * FROM ALL_TAB_COL_STATISTICS WHERE TABLE_NAME = 'XXXX';

【讨论】:

  • 嗨,Husqvik,感谢您的快速回复。如果我不运行表统计信息,我可以获得准确的空间使用量大小吗?
  • 当然,只需检查此线程 - stackoverflow.com/questions/264914/…
  • 知道了。如果不运行 DBMS_STATS.GATHER_TABLE_STATS,则 ALL_TAB_COL_STATISTICS 为空。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2013-04-29
  • 2021-07-28
  • 2018-01-13
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多