在查询优化里面,经常要对数据库的查询结果的基数进行估计,利用它来计算代价,从而基于代价选择最优的执行计划。

那么这个基数到底是什么呢?基数本来是一个数学上的概念,即一个集合的大小,因为集合是不包含重复元素的,所以就是不同值的个数,而在数据库领域,基数要从两个层面来说:

  1. 如果是指一列,那么基数就是不同值的个数。
  2. 如果是指一个关系,那么就是整个关系的大小也就是行(tuples)的个数。猜测这么定义是因为一般一个表都是有主键的,那么每一行肯定都是不同的。
  3. 如果是指查询的中间结果,也是指结果集的大小。

下面是截取几个文献关于基数的说法:
891607497272_.pic.jpg
来自:文献2

901607497299_.pic.jpg
来自:文献5

911607497366_.pic.jpg
来自:文献6

参考资料:

  1. what-is-cardinality-in-databases
  2. costmodels
  3. Cardinality-wiki
  4. Jonathan_Lewis-Calculating_Join_Selectivity-Manuskript
  5. what-is-cardinality-in-a-database
  6. Selinger, P Griffiths, M M Astrahan, D D Chamberlin, R A Lorie和T G Price. 《Access Path Selection in a Relational Database Management System》, 不详, 12.