根据这个:
选择性是介于 0 和 1 之间的值,它是对表应用过滤器后返回的行的分数。例如,如果一个表有 10,000 行并且查询返回 2601 行,则选择性将为 2601/10000 或 0.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行,查询代码:【全选】【显示/隐藏】
select * from employees where last_name = 'Smith'
返回 2 行,选择性是 2/107 = 0.01?所以它是满足谓词的行数/总行数。所以这个方程中没有“不同”。
除了语句的这种选择性之外,还有一个列选择性,它由 NDV(该列中不同值的数量 - 可以从 dba_tab_col_statistics 查询)/总行数表示(http://www.runningoracle .com/product_info.php?products_id=233)。因此,如果 NDV 为 103,则 last_name 列的选择性为 103/107 = 0,96。
这就是我的理解..这是正确的吗?如果我错了,请纠正我。
谢谢你。