Oracle实例版:“Oracle Database 11g企业版11.2.0.1.0版 - 64位生产版”
我们在[ord]表中插入1000条记录并执行以下脚本来收集统计信息,现在成本为9
EXEC dbms_stats.gather_table_stats('COREBM','ORD',degree => 4,estimate_percent => null,method_opt => 'for all columns',cascade => TRUE);
然后我们清除[ord]表中的数据([从ord删除]),确保提交的更改,然后再次执行[EXEC dbms_stats.gather_table_stats(...)]来收集统计信息,我们看到成本仍然是9,这与我预期的2
删除[ord]表中的所有数据后,我们收集了统计信息,我不明白为什么[ord]表的成本仍为9,即使该表中没有任何内容。
答案 0 :(得分:1)
假设您的查询正在对表进行全面扫描,这意味着它必须读取每个块直到表的高水位线。当您执行简单的DELETE
数据时,不会重置高水位标记 - Oracle假定您将来可能会插入更多数据,因此在删除数据时不会产生释放范围的成本此后不久需要重新获取它们。这意味着,尽管当您拥有1000行数据时,全表扫描的成本与您随后拥有0行具有相同高水位线的数据一样昂贵。因此,在运行DELETE
后,您可能会期望成本相同。
如果要重置高水位线,可以TRUNCATE
表格,而不是简单地删除数据。这不是你通常会做的事情,但它可以用于这种概念证明。