2009-12-02 22 views
0

previous question我评论有关甲骨文公司的统计数据:Oracle如何使用统计数据

Oracle不知道50M比行数量。当然,它有统计数据,但它们可能是老的和错误的 - 而且Oracle不会因为统计数据错误而导致错误的结果

我非常肯定Oracle在准备查询执行时依赖统计信息计划。在版本10之前,建议不时刷新统计信息,并从Oracle 10g自动收集统计信息。

有人可以解释有多少Oracle查询分析器依赖于统计数据吗?

回答

3

Oracle使用统计很多,生成查询执行计划。它没有(也不应该)做的是以影响查询结果的方式使用这些统计数据,这是您尝试使用“ROWNUM < 50000000”所做的。统计信息可能已过时或缺失。但是,这只会意味着Oracle可能会生成正确结果的速度较慢,但​​这并不意味着Oracle将返回错误的结果。

如果Oracle按照您的希望工作,那么即使该表现在包含60,000,000行(但包含过时的统计数据表明它只包含49,000,000),它可能会决定“ROWNUM < 50000000”意味着“获取所有行”。幸运的是,它没有。

+0

这就是我在问题中引用评论时的意思。 – 2009-12-02 13:37:35

2

统计信息对查询优化器非常重要。他们应该定期自动或手动收集。

执行查询时,Oracle会生成一个可用执行计划的池,以满足您的查询。这些执行计划从他们将返回相同的确切结果的角度来看是相同的,这只是一条通往另一个计划的道路。为了确定这种效率,Oracle使用在每个执行计划中使用的对象上生成的统计信息来确定其各自的成本。如果这些统计数据不存在或者陈旧,那么与每个计划相关的成本将不太准确,因此可能不会选择最优方案。

下面是一些Oracle使用确定这个成本的关键统计数据的:

表统计

* Number of rows 
* Number of blocks 
* Average row length  

列统计

* Number of distinct values (NDV) in column 
* Number of nulls in column 
* Data distribution (histogram) 
* Extended statistics 

指数统计

* Number of leaf blocks 
* Levels 
* Clustering factor 

系统统计

* I/O performance and utilization 
* CPU performance and utilization 
2

统计数据用于由Oracle基于成本的优化器(CBO)来计算的执行,使得最合适的一个,可以选择一个查询的不同的方式的相对成本。

总的来说,这项工作非常好,并且正在不断改进。例如,在11g中,您可以收集多列直方图,这些直方图对查询具有相关列上的谓词有很大帮助(例如像出生月份和星号那样强相关,或者像性别和身高那样更弱地纠正)。

然而它并不完美。例如,估计两个表之间连接的结果集的基数是相当准确的,就像估计来自过滤器操作的基数一样,但是将两者结合需要很多估计,这很容易是不准确的。在某些情况下,这些问题可以通过提示或针对中间结果集使用全局临时表来解决。

统计的另一个问题是,改变它们可以改变执行计划,所以最近有更多的运动要么阻止持续收集统计数据,要么在实施统计之前分析统计变化的影响。

寻找乔纳森刘易斯的书 - 这是一个非常彻底的治疗主题。

+1

请注意,11g引入了SQL计划管理,以基于新统计信息启用对执行计划更改的更大控制。您现在可以有效地锁定执行计划,以便即使基于成本找到更好的计划,也可以使用它。 DBA可以通过企业管理器查看并允许使用这些执行计划。这允许持续收集统计数据,同时控制数据库中关键表上与它们相关的变化。 – 2009-12-02 20:02:15

+0

是的,这是一个很好的功能。 – 2009-12-03 07:41:32