我需要澄清DBMS_STATS.GATHER_TABLE_STATS的工作原理。 我有一个场景,如果我正在创建表,同样的表也用于包创建。换句话说,包编译依赖于表创建。
在表创建脚本中的索引创建命令之后是否必须包含DBMS_STATS.GATHER_TABLE_STATS。
DBMS_STATS.GATHER_TABLE_STATS在哪种情况下工作,无论是用于包编译还是包执行。请确认。
答案 0 :(得分:0)
DBMS_STATS
为Oracle优化器提供信息,使Oracle能够为SQL语句构建高效的执行计划。编译对象永远不需要优化程序统计信息。
收集统计数据是一个非常复杂的主题,起初可能很难提出正确的问题。我建议您先阅读手册,例如Managing Optimizer Statistics: Basic Topics。
通常,您的统计信息收集策略应如下所示:
要回答一些具体问题,您可能不想要在创建表格后立即收集统计信息。仅在更改数据后收集统计信息。收集空桌上的统计数据可能很危险; Oracle会认为该表有0行,直到下次收集统计信息。最好根本没有统计数据,然后Oracle可以使用动态抽样来估计统计数据。
(但另一方面,如果表创建为SELECT
语句并包含大量数据,则可能需要收集统计信息。然后,如果您使用12c,它可能会自动收集统计信息在创建表时。)
创建索引后,通常也不需要收集统计信息。在创建或重建索引时,Oracle会自动收集索引统计信息。