4

根据这个:

选择性是介于 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。

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

谢谢你。

4

1 回答 1

3

选择性总是基于当时应用的任何标准。

这对特定表的确切含义取决于连接顺序。

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

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

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

这是加入顺序对计划如此重要的原因之一。

于 2014-03-09T22:00:21.760 回答