oracle 基数选择率究竟是个什么

2023年 9月 2日 26.2k 0

选择率和基数
选择率(selectivity)是一个介于0和1之间的值,用来表示某个操作所返回的记录数的比例。例如,一个操作从表中读取120行,在应用过滤条件后,返回其中的18行,那么选择率就是0.15(18/120)。选择率也可以用百分比来表示,所以0.15也可以表示成15%。

当选择率接近于0时,称之为具有强选择性;
当选择率接近于1时,称之为具有弱选择性。

警告 我以前经常使用低/高或者好/坏这样的词表示强/弱的意思。之所以现在不再使用低/高,是因为这样的词无法明确表达其指的是选择率的程度高低还是其数值的高低。事实上,存在各种各样自相矛盾的定义。我不再使用好/坏是因为将质量的优劣与选择率联系在一起是不合理的。

一个操作返回记录的行数称作基数(cardinality)。 公式2-1解释了选择率与基数之间的关系。
基数=选择率 x 行数

警告 在关系模型中,基数指关系中的元组数量。因为当关系是一元的时候绝对不包含重复记录,
元组的数量对应着其代表的不重复值的数量。可能基于这个原因,在一些出版物中,基数指的是某列中不重复的值的数量。

因为SQL允许表中包含重复记录(也就是说SQL在这一点上并不遵守关系模型),我从不用基数表示某列中不重复的值的数量。另外,Oracle自身在定义这个术语时也并非完全一致。有时,Oracle在文档中用它来指不重复的值的数量,有时也用它来指一个操作返回的记录行数。

来看几个selectivity.sql脚本的例子。在下面的查询中,访问表的操作选择率是1。这是因为没有应用WHERE条件,因此查询返回了表中的所有记录。基数就等于表中的记录的行数,即10000。

SQL> SELECT* FROM t;
10000 rows selected.

下面的查询中,访问表的操作基数是2601,因此选择率就是0.2601(返回10000行中的2601行)。
SQL> SELECT * FROM t WHERE n1 BETWEEN 6000 AND 7000;
2601 rows selected.

下面的查询中,访问表的操作基数是0,因此选择率也是0(返回10000行中的0行)。
SQL> SELECT* FROM t WHERE n1 =19;
no rows selected.

在上面的三个例子中,与访问表操作相关的选择率是用查询表返回的基数除以表中存储的记录行数计算得来的。这种算法之所以可行,是因为三个查询都不包含连接或聚合操作。一旦查询中包含GROUP BY条件或者SELECT中含有聚合函数,则执行计划中至少应包含一个聚合操作。

下面的查询说明了这一点(注意sum聚合函数)。
SELECT sum(n2)FROM t WHERE n1 BETWEEN 6000 AND 7000;

在这类情形下,无法通过查询的基数(本例中为1)计算访问操作的选择率,而是应该通过类似下面的查询找出访问操作返回了多少行作为聚合函数的输入。此时,访问表的访问操作的基数是2601,因此选择率是0.2601(2601/10000)。
SELECT count(*)FROM t WHERE n1 BETWEEN 6000 AND 7000;

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论