数据库里面的cardinality(基数)到底是什么?
在查询优化里面,经常要对数据库的查询结果的基数进行估计,利用它来计算代价,从而基于代价选择最优的执行计划。
那么这个基数到底是什么呢?基数本来是一个数学上的概念,即一个集合的大小,因为集合是不包含重复元素的,所以就是不同值的个数,而在数据库领域,基数要从两个层面来说:
- 如果是指一列,那么基数就是不同值的个数。
- 如果是指一个关系,那么就是整个关系的大小也就是行(tuples)的个数。猜测这么定义是因为一般一个表都是有主键的,那么每一行肯定都是不同的。
- 如果是指查询的中间结果,也是指结果集的大小。
下面是截取几个文献关于基数的说法:
来自:文献2
来自:文献5
来自:文献6
参考资料:
- what-is-cardinality-in-databases
- costmodels
- Cardinality-wiki
- Jonathan_Lewis-Calculating_Join_Selectivity-Manuskript
- what-is-cardinality-in-a-database
- 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.
Author: DongSheng
Link: http://ehds.github.io/2020/12/09/WhatIsDatabaseCardinality/
License: 知识共享署名-非商业性使用 4.0 国际许可协议