|
|
1
7
生成10053跟踪文件将有助于准确显示优化器在估计基数和选择性方面所做的选择。乔纳森·刘易斯的特长 基于成本的Oracle基础知识 是了解优化器如何工作的一个很好的资源,我的打印跨越了8i到10.1。 从这项工作中:
但是,因为我们有一个多列联接,所以联接选择性不在表级别,而是每列上联接选择性的乘积(交集)。假设游戏中没有空值:
我们知道在上没有过滤器,所以这是表过滤器基数是行数。我们从B中选择键值,所以表的过滤基数是1。 因此,估计的联接基数的最佳情况是
向后工作可能更容易。根据我们所知,您的估计基数406将导致join selectivty为406/5000000,或约为1/12315。这恰好非常非常接近1/(116^2),这是优化器中的健全性检查,以防止优化器在多列联接上发现过于激进的基数。 对于TL;Dr Crowd:
|
|
|
2
2
基数估计将基于a.key1和a.key2的选择性的乘积,而a.key1和a.key2的选择性(至少在10g中)将分别基于列统计中记录的这两列的不同值的数目。 对于5米行的表,406的基数估计与7366的基数估计没有显著差异。你必须问自己的问题是,这里的“不准确”估计是否会引起问题? 如果Oracle能够生成一个完全准确的估计,那么您可以通过获取一个解释计划来检查它将选择什么计划:
如果这产生了相同的计划,那么Oracle正在计算的估计已经足够了。 |
|
|
3
2
您可能有兴趣阅读Wolfgang Breitling的这篇优秀论文,该论文对CBO计算有很多信息: http://www.centrexcc.com/A%20Look%20under%20the%20Hood%20of%20CBO%20-%20the%2010053%20Event.pdf . 正如这里所解释的,因为您有柱状图,所以这些列的过滤因子计算不使用不同值的数目(ndv),而是使用密度,密度是以某种方式从柱状图派生出来的。 A.key1和A.key2的用户选项卡列中的密度值是什么? 一般来说,这种情况下的问题是Oracle不收集成对列的统计信息,并假定它们的组合过滤因子将是它们各自因子的乘积。如果两列的值之间存在相关性,这将产生较低的估计值。 如果这会导致严重的性能问题,我想您可以基于这些列的函数创建一个基于函数的索引,并使用它进行查找。然后,甲骨文将收集该指数的统计数据,并可能做出更好的估计。 |
|
Sweepy Dodo · JSON lite的格式化 1 年前 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
Zegarek · Postgresql递归查询未提供预期结果 1 年前 |
|
|
Joe · 为什么这两个查询之间的性能存在如此大的差异? 1 年前 |
|
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 1 年前 |