为什么他们使用DBMS_STATS.GATHER_TABLE_STATS?

时间:2013-03-22 16:33:36

标签: database performance oracle

我发现文件解释说oracle使用这些来进行性能调整等,但不太明白它实际上做了什么。有人可以用简单的单词和非常基本的例子向我解释一下吗?

1 个答案:

答案 0 :(得分:38)

大多数企业数据库(包括Oracle)使用基于成本的优化器来确定给定SQL语句的相应查询计划。这意味着优化器使用有关数据的信息来确定如何执行查询而不是依赖于规则(这是旧的基于规则的优化器所做的)。

例如,设想一个简单的错误跟踪应用程序表

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

如果我是一家大公司,我可能在此表中有100万行。其中,100个具有issue_status个ACTIVE,10,000个具有issue_status QUEUED,989,900具有COMPLETE状态。如果我想对表运行查询以查找我的活动问题

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

优化器可以选择。它可以使用issue_status上的索引,然后在表中为匹配的索引中的每一行执行单行查找,也可以在issues表上执行表扫描。哪个计划更有效将取决于表中的数据。如果Oracle希望查询返回表中的一小部分数据,则使用索引会更有效。如果Oracle希望查询返回表中大部分数据,则表扫描会更有效。

DBMS_STATS.GATHER_TABLE_STATS正在收集允许Oracle做出此决定的统计信息。它告诉Oracle表中大约有100万行,issue_status列有3个不同的值,并且数据分布不均匀。因此Oracle知道使用查询索引来查找所有活动问题。但它也知道当你转身并试图寻找所有已结束的问题时

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

进行表扫描会更有效率。

收集统计信息允许查询计划随着数据量和数据分布的变化而发生变化。首次安装问题跟踪器时,您将遇到很少的COMPLETED问题以及更多ACTIVE和QUEUED问题。随着时间的推移,COMPLETED问题的数量上升得更快。当您在表中获得更多行并且各种状态中的行的相对分数发生变化时,查询计划将发生变化,以便在理想情况下,您始终可以获得最有效的计划。

相关问题