什么是选择性?

jup*_*ter 4 sql-server

问题是我不明白——不,我确实理解选择性——但我一直在阅读它的不同定义,这令人困惑。

我的想法(基于Gail Shaw 的观点):选择性就是谓词所具有的。列不是选择性的。索引没有选择性。运营商没有选择性。选择性是谓词影响的行百分比的度量。

困惑:

SQL Server 执行计划第三版,Grant Fritchey。第223页。他说

对于给定索引,谓词的选择性是匹配行的预期比率。计算表中的总行数 (z),计算所有行中给定列或列组合的不同值 (x) 的数量,然后 (x/z) 给出索引的选择性,用于将列(或多列)与未知值进行比较的相等谓词。

高选择性索引将具有低选择性值。例如,选择性为 0.01 (1%) 意味着优化器期望表中总行的 1% 与谓词匹配。相反,最差的选择性是 1.0(或 100%),这意味着每一行都将匹配谓词条件。

呃?我认为高度选择性,即 100%,即 100% 的值是不同的,是一件好事。但他表示 100% 是最差的选择性。

然后在本文中,他们计算出具有 2 个不同值(性别)的色谱柱的选择性为 0.02%。但 0.02% 肯定不太好。

mus*_*cio 9

选择性是查询谓词的属性。定义选择性的一种方法

选择性是指任何行满足谓词(即为真)的概率。

因此

对于对具有 1,000,000 行的表进行操作的谓词,选择性为 0.01 (1%) 意味着该谓词返回估计的 10,000 行(1,000,000 行的 1%),并丢弃估计的 990,000 行。

行与谓词匹配的概率高意味着选择性值高。

不幸的是,词语的选择令人困惑,正如您所发现的:

高度选择性的谓词(选择性为 0.10 或更小)是可取的。

“高度选择性”(“非常选择性”可能是更好的选择)谓词导致低选择性值(即给定行与谓词匹配的概率较低)。


似乎许多人,包括您引用的来源的作者,都使用“选择性”一词来表示完全不同的含义。他们通常将其称为“索引选择性”,并将其计算为索引键基数(不同键值的数量)与基础关系基数的比率。因此,不同的键值越多,“选择性”就越高(接近 1),这当然是该列组合的谓词选择性的倒数。

这种混乱似乎是由SQL Server 文档造成的,它指出(强调我的):

密度是有关给定列或列组合中重复项数量的信息,计算公式为 1/(不同值的数量)。查询优化器使用密度来增强从同一表或索引视图返回多个列的查询的基数估计。随着密度降低,值的选择性增加。

考虑到这一点

频率是有关统计对象的第一个键列中每个不同值出现的信息,计算公式为行数 * 密度。在具有唯一值的列中可以找到最大频率 1。

我们可以看到值频率=行数/(不同值的数量)并意识到微软所说的“值选择性”的倒数。随后,不同值的数量越少,值频率越高,值选择性越低。这似乎就是您的消息来源正在谈论的内容(尽管令人困惑的是,第一个消息来源在同一个句子中提到了谓词选择性)。

话虽这么说,当您阅读有关“选择性”的内容时,您需要了解特定作者所考虑的选择性是什么样的。