0

Oracle 实例版本:“Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production”

  • 新建一个表[ord],表中什么都没有,我们用[select * from ord]来查看统计信息,代价是2
  • 我们将 1000 条记录插入 [ord] 表并执行以下脚本来收集统计信息,现在成本为 9

    EXEC dbms_stats.gather_table_stats('COREBM','ORD',degree => 4,estimate_percent => null,method_opt => '对于所有列',cascade => TRUE);

  • 然后我们清除 [ord] 表中的数据([delete from ord]),确保更改已提交,然后再次执行 [EXEC dbms_stats.gather_table_stats(...)] 收集统计信息,我们看到成本仍然是 9与我期望的不同 2

在[ord]表中的所有数据被删除之后,我们收集了统计信息,我不明白为什么[ord]表中的成本仍然是9,即使该表中没有任何内容。

4

1 回答 1

1

假设您的查询正在对表进行全面扫描,这意味着它必须读取每个块直到表的高水位线。当您执行简单的数据时,不会重置高水位线DELETE——Oracle 假设您将来可能会插入更多数据,因此不会产生释放扩展区的成本,因为您删除数据只需要很快重新获取它们此后。这意味着,尽管当您拥有 1000 行数据时,全表扫描的成本与随后拥有具有相同高水位标记的 0 行数据时的成本一样高。因此,您会期望在运行DELETE.

如果要重置高水位线,可以TRUNCATE对表而不是简单地删除数据。这不是您通常会做的事情,但它可以用于这种概念证明。

于 2013-09-04T04:47:37.620 回答