基数(Cardinality)与选择性(Selectivity)是数据库理论和SQL优化领域中的两个重要概念,特别是在关系型数据库管理系统(如Oracle、MySQL等)中用于评估查询效率和索引效果的关键指标。
1、基数(Cardinality):
- 在数据库中,某列的基数指的是该列中不重复值的数量,即唯一键(Distinct Values)的数量。例如,假设一个表中有1000行数据,其中一列包含性别信息,只有“男”和“女”两种值,那么这一列的基数就是2。
- 对于索引而言,基数则指该索引所覆盖列组合的唯一键数量。索引基数越大,意味着通过索引区分的数据行更多,这有助于缩小查询范围。
2、选择性(Selectivity):
- 选择性是衡量一个列或一组列对于过滤数据的有效程度,它是基于基数与表中总行数的比例计算得出的,公式为:选择性 = (基数 / 总行数) * 100%。
- 如果一个列的选择性较高,表示该列的值在整个表中分布得比较均匀,也就是说,通过该列筛选数据能有效地减少检索的数据量,这对于索引的设计和查询性能至关重要。
- 当选择性超过一定阈值(如20%),通常认为在这个列上创建索引对提高查询性能有利,因为它能帮助优化器更准确地估计查询的代价,引导其选择更快的执行计划。
3、计算基数与选择性:
在Oracle数据库中,获取某一列基数(Distinct Count)和选择性可以通过以下方式实现,但请注意,Oracle并没有直接提供查询选择性的内置函数,我们需要手动计算选择性。
首先,我们先查询列的基数,假设我们有一个名为employees
的表,我们要查看department_id
列的基数:
SELECT