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