Oracle选择性/基数

时间:2014-03-08 16:49:28

标签: oracle oracle11g cardinality

根据这个:

  

选择性是介于0和1之间的值,它是在表上应用过滤器后返回的行的分数。   例如,如果   一个表有10,000行,查询返回2601行   选择性为2601/10000或.26或26%。选择性   使您(或优化器)能够决定访问哪些数据   方法在执行计划中是最佳的。

我需要一些澄清:好的,该表有10000行,查询只返回2601行。但是,如果该查询块包含三个连接表,或者它包含where子句中的子查询,该怎么办?所以在FROM子句中有三个表,第四个表是where子句子查询的一部分,那么如何计算这个选择性呢?

选择性=满足条件的行数(从哪个表?)/总行数(来自所有四个表?)

基数相同的问题(基数=选择性*总行数)。

我发现了很多关于此的文章,但是每个文章都使用简单的select语句来说明这些概念,基于单个表或单个where子句条件。

有人可以给我一个例子,说明如果有更复杂的查询(在“hr”模式或其他训练目的模式上),这些度量是如何计算的,这意味着FROM子句或WHERE子句中的子查询,等等上?

谢谢。

编辑: 我需要对由Estimator(基于成本的优化器)计算的选择性度量做一些澄清。 http://gerardnico.com/wiki/database/oracle/selectivity 例如,对于等式谓词(last_name ='Smith'),选择性设置为last_name的不同值的数量n的倒数,因为查询选择的行包含n个不同值中的一个。

我不知道如何理解“不同值的数量n的倒数”。

假设employees表有107行,并且查询 代码:[全选] [显示/隐藏]

从员工中选择*,其中last_name ='Smith'

返回2行,选择性为2/107 = 0.01?所以它是满足谓词/总行数的行数。所以这个等式中没有“明显的”。

除了语句的这种选择性之外,还有一个列选择性,它由NDV(该列中不同值的数量 - 可以从dba_tab_col_statistics查询)/总行数({{3})表示})。因此,如果NDV为103,则last_name列的选择性为103/107 = 0.96。

这就是我所理解的......这是正确的吗?如果我错了,请纠正我。

谢谢。

1 个答案:

答案 0 :(得分:3)

选择性总是基于当时正在应用的标准。

对于特定表,这意味着什么取决于连接顺序。

Oracle将始终通过从其自身的特定表中选择行来开始执行查询。在这种情况下,根据您阅读的示例,选择性很简单。此时没有要考虑的连接条件。

接下来,它加入第二个表。 Oracle估计有多少行只能直接满足该表的常量条件,以及第一个表中的任何连接条件。后者称为“连接选择性”。

然后,当加入第三个表格时,它会根据加入前两个表格以及任何恒定条件进行估算。

这是加入订单对计划非常重要的原因之一。

相关问题