解密openGauss数据库中的函数依赖关系
生活中总是存在着错综复杂的联系,例如喜欢打篮球的人,身高普遍比较高;喜欢穿艳丽色衣服的人,性格会普遍比较开朗;在超市买炸鸡的人,会大概率买啤酒。而反过来,这种联系并不一定成立。
在数据库领域,表中的不同属性就像生活中不同的事物,也会存在着各种类似的关联关系。如何利用这种关联关系来提升数据库查询性能?这篇文章可以解密openGauss的一种应用方案,该特性可通过GUC参数enable_functional_dependency进行控制。
1、函数依赖的用途
函数依赖特性就是用一个介于0~1的值来量化这种关联关系的强弱程度,这个数值又被称为函数依赖度,其中0表示没有关联,1表示完全关联。函数依赖,是多列统计信息的一种,可以描述两个属性之间的关联关系的强弱,也可以用于描述多个属性与另一个属性的关联关系的强弱,其主要用途是提高选择率计算的准确性。其中选择率的定义为:
选择率是对SQL查询结果规模的预期,取值0~1。如果选择率比较大,即接近于1,那么查询优化器会倾向于使用顺序扫描,如果选择率比较小,即接近于0,查询优化器会倾向于使用索引扫描,如果介于两者之间,查询优化器倾向于使用位图扫描。所以选择率能否估算准确,会直接影响到执行计划的选择,进而影响到数据库的查询效率。函数依赖特性的加入,能一定程度上提高选择率估算的准确性。
在引用函数依赖特性之前,数据库会使用条件独立假设的方法来估算选择率。举一个生活中的例子,在一个班级中,男女生的比例是1:1,喜欢篮球的人数占比为20%,身高175cm以上的人数占比为50%。我们可以说喜欢篮球且身高在175cm以上的男生的占比为50% * 20% * 50% = 5%吗?显然这个计算结果会比实际结果低,因为这几个属性之间有关联关系,喜欢篮球的人普遍身高偏高,喜欢篮球的人中男生占多数,男生的身高较女生普遍偏高。
2、理论推导
下面我们从理论上来对比,条件独立假设和函数依赖在计算选择率时的差异。假设一个表 t(a int, b int, c int),A是只与属性{a}相关的等式约束条件,B是只与属性{b}相关的等式约束条件。在条件独立假设下,同时满足约束条件A和约束条件B的选择率的计算公式为:
s(A,B) = s(A)* s(B)
这会导致选择率一定程度的低估,因为约束条件A和约束条件B会存在或强或弱关联,而这里并没有考虑在内。引入函数依赖特性,并应用函数依赖关系a=>b:fa→b来计算选择率s(A, B)的理论公式为:
s(A,B) = fa→b * s(A) + (1 — fa→b) * s(A) * s(B)
其中,fa→b为一个实数,取值0~1。类似地,对于含有三个属性的函数依赖关系"a , b=> c:fa,b—>c ",计算选择率s(A, B, C)的理论公式为:
s(A,B,C)= fa,b→c * s(A,B) + (1 — fa,b→c) * s(A,B) * s(C)
但是在实际应用中,考虑到最终的选择率不能大于任何一个属性列的选择率,需要对上述的理论公式做一个轻微变形,用min(s(A), s(B))来代替第一项的s(A),min(s(A, B), s(C))来代替第一项的s(A, B)。这种变形会对计算不满足函数依赖的数值的选择率,产生一定的修正作用。
s(A,B) = fa→b * min(s(A), s(B)) + (1 — fa→b) * s(A) * s(B)
s(A,B,C)= fa,b→c * min(s(A, B), s(C)) + (1 — fa,b→c) * s(A,B) * s(C)
3、应用示例
上面我们已经对openGauss数据库中的函数依赖关系进行了理论上的介绍,下面我们看看在具体实践中,应该如何操作。下面的几个例子,可以很好地展现openGauss数据库的该特性。
--优化SQL查询的行数估计模型前
通过在openGauss中使用函数依赖关系的数据库优化技术,我们可以看到数据库的查询优化性能得到了显著的提升。
相关文章
- Centos8安装Mariadb出现mysql_secure_installation: command not found的解决办法
- 基于 Docker 搭建 MySQL 一主两从复制
- MySQL运行机制原理与架构
- Mysql——分组统计
- Mysql——字符串函数
- 牛客刷题——Mysql系列
- MYSQL——JBDC实现增删改查
- 数据库基础,看完这篇就够了!
- MySQL不要再用utf8了
- 快速学会慢查询SQL排查
- Android破解心得——记学习七少月安卓大型安全公开课
- 新特性解读 | MySQL 8.0.31 导入直方图存量数据
- 【Qbot】4.连接mysql/限制使用次数
- MySQL 为什么要使用索引及索引创建的原则有哪些?
- MySQL 6种索引数据结构详解:BTree、B+Tree、红黑树、平衡二叉树、二叉树、Hash
- MySQL 聚集索引(InnoDB)和 非聚集索引(MyISAM) 精讲~两张图彻底搞懂
- MySQL 事务隔离级别 理论+实战分析
- MySQL MVCC 多版本并发控制机制 工作原理
- MySQL : 彻底搞懂一条SQL的执行过程
- 彻底搞懂MySQL主从复制工作原理 2+3+3+4