Oracle 选择性 / 基数

4
根据此文:
选择性是0到1之间的值,它是在对表格应用过滤器后返回的行数的分数。例如,如果一个表有10,000行,查询返回2601行,则选择性为2601/10000或.26或26%。选择性使您(或优化器)能够决定执行计划中哪种数据访问方法最佳。
我需要一些澄清:好的,那个表有10000行,但如果查询块包含三个连接的表,或者它包含where子句中的子查询呢?因此,在FROM子句中有三个表,并且第四个表是where子查询的一部分,那么如何计算这个选择性?
选择性=满足条件的行数(来自哪个表?)/总行数(来自所有四个表?)
基数的情况也是相同的(基数=选择性*总行数)。
我找到了很多关于此的文章,但每篇文章都是用简单的select语句来说明这些概念,基于单个表或单个where子句条件。

请问有人能为我举一个稍微复杂一些的查询(在“hr”模式或其他培训目的模式上),例如FROM子句或WHERE子句中的子查询,以及其他情况下如何计算这些度量标准的示例吗?

谢谢。

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

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

假设员工表有107行,并且查询 Code: [Select all] [Show/hide]

select * from employees where last_name = 'Smith'

返回2行,则选择性为2/107 = 0.01吗?因此它是满足谓词的行数/总行数。因此,在这个方程中没有涉及“不同”。

除了语句的选择性之外,还有列选择性,它由该列中不同值的数量(可以从dba_tab_col_statistics查询)/总行数(http://www.runningoracle.com/product_info.php?products_id=233)表示。因此,如果NDV为103,则姓氏列的选择性为103/107 = 0.96。
这是我理解的内容..是否正确?如果我错了,请纠正我。
谢谢。
1个回答

3

选择性总是基于当前应用的标准。

对于一个特定的表而言,这意味着什么取决于连接顺序。

Oracle 会始终从一个特定的表单独选择行开始执行查询。在这种情况下,选择性就像你读到的例子一样明显。此时没有考虑联接条件。

然后,它加入第二个表。Oracle 根据第一个表的联接条件和直接作用于该表的常量条件估计满足条件的行数。后者称为“联接选择性”。

接下来,当联接第三个表时,Oracle 基于与前两个表的连接以及所有常量条件进行估计。

这也是为什么连接顺序对计划如此重要的原因之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接