截断并插入后需要收集统计信息吗?

时间:2019-06-19 21:40:22

标签: oracle database-performance

我需要截断并重新加载表。

我了解到truncate需要将统计信息收集在表上作为其后续过程,以便数据库获取实际统计信息,否则truncate语句不会清除以前的统计信息。

完成这两项操作(在空表上截断和收集统计信息)之后,运行插入...,但是在我的表的all_tab_statistics表中看不到新的统计信息。 Sample_size仍为0。

那是为什么?插入后,Oracle不应该执行自动统计信息收集吗?

我是否需要重新运行统计信息,或者考虑到此表的性能是否还可以(请注意,它将每次都被截断并重新加载)?

2 个答案:

答案 0 :(得分:0)

请考虑以下方法。它具有表始终存在的优点。

  1. 像旧表一样创建一个空表。
  2. 将数据加载到新表中。这是最慢的步骤。
  3. 执行您可能需要的任何清理工作,例如刷新统计信息。
  4. RENAME表以交换新表。此步骤足够快,因此您不会注意到。

答案 1 :(得分:0)

我知道我已经很久没有在上面发布我的问题了。但最近,我们再次面临类似的情况,这一次,以下步骤致力于在具有 8 亿行的表上获得更好的性能。

  1. 备份原始表。
  2. 截断原始表。
  3. 收集截断表上的统计信息,以便统计信息在数据库中显示为 0。我们在命令中使用 CASCADE=>TRUE 也可以在进程中包含索引。
  4. 删除截断表上的索引并插入备份表中所需的数据。
  5. 重新创建索引并再次收集统计数据(当然,使用 CASCADE=>TRUE;但是理想情况下,索引的重新创建应该已经计算出适当的统计数据)。
  6. 如果不需要,删除备份表。