热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于代价解析的最优路径规划CBO

CBO代价解析在过去数据库主要使用基于规则的优化器(RBO),基于规则将SQL解析生成的关系表达式进行等价交换,形成更优的方案,例如,有一个多表查询SQLselecta.c_id,

CBO代价解析
在过去数据库主要使用基于规则的优化器(RBO),基于规则将SQL解析生成的关系表达式进行等价交换,形成更优的方案,例如,有一个多表查询SQL

select a.c_id,sum(c.price) from a,b,c where a.c_id=c.c_id and c.o_id=b.o_id group by a.c_id order by sum(c.price) desc;

如果直接解析,将会把a,b,c查询的一部分创建为CROSS JOINS,再创建FILTER。再未优化的情况下,CROSS JOINS将产生大量的中间数据。即使试图执行这样的计划也没有意义。

取而代之,利用RBO规则引擎,将会把cross join修改成按key进行两表连接的方式。确实会比CROSS JOINS更好。

同样的表连接,将大表放入内存和将小表放入内存明显会有效率上的差异,但给予规则,此类设计会很复杂。

而基于CBO,将会明显提升效率。所以在数据库的CBO设计中,主要参考了传统关系型数据库,将CPU时间、内存需求和网络带宽使用率作为三个影响查询执行效率的三个维度。

在数据库中记为成本。同时根据表的内部统计信息,在逻辑计划转换成物理计划时,派生多个不同的物理计划,并对每个物理计划进行评价,估计实现这个转换的代价。除枚举外同时考虑使用动态规划算法。

考虑有多个查询同时进行,每个查询的成本不同,如何做到更高并发的查询计划,需要进行权衡,这基本意味着需要以尽可能少的资源尽可能快地执行查询。在数据库中,使用成本概念进行建模,捕获例如CPU成本、内存需求和网络带宽使用率之类的属性,探索查询执行计划的不同变体,分配成本并进行比较,选择总成本最低的变体执行。这种方法巧妙地平衡了集群对于查询响应速度、高并发等需求。

在查询计划中,每项操作的成本均以适合于该操作类型的计算方式及该操作涉及的数据统计信息进行计算。

path

查询执行计划的拆分汇总
表扫描(读取表;运行时与过滤器结合使用)、过滤器(SQL的where子句或查询计划程序推断出的任何其他条件)、投影(计算输出表达式)、JOIN、聚合、排序(ORDER BY)、限制(LIMIT等)、排序和限制组合(例如order by limit)、其他。

表扫描统计。

表从读取数据的任何过滤条件的使用,例如表中如果存在分区,过滤条件排除掉某些分区后,则统计信息将考虑使用更小的数据集,并且更加准确。

过滤统计。

在进行过滤操作时将分析过滤条件,并计算估算值,包括以下:数据行通过过滤条件的概率(得到过滤器之后的预期行数);过滤条件涉及的列的不同值的数量;不属于过滤条件的列的不同值的数量(如果原始不同值数量大于通过过滤器的数据行的预期数量),理想状态下,估算值=输入行数*非空值分数/去重值。

投影统计。

按关系型理论考虑投影,投影的结果大小是可精确计算的,通常,投影与过滤器类似,不同之处在于,投影不会影响操作后的预期行数,对于投影,将计算以下类型的列统计信息:投影产生不同值的数量,NULL投影产生的值,投影产生的最小值/最大值。如果投影表达式是直接返回的,则无需统计。如果是将其作为过滤器或连接操作时,则这些统计信息对于正确估计过滤器条件或连接返回的行数很重要。

CBO从概念上来说是简单的,流程上考虑替代查询计划,选择并执行最佳计划,但细节上比传统关系型数据库需要考虑的更多,传统数据库基本只需要考虑磁盘IO即可。

在未使用CBO优化器前,针对1TB数据量的TPC-DS数据,在查询某些SQL时(如query72),需要至少三个小时或以上才可以出结果,而在增加CBO优化器后,进行查询将时间缩短到了5分钟左右,效率整整提升了至少10倍到100倍。
原文链接:https://blog.csdn.net/m0_51698806/article/details/113770198

螃蟹在剥我的壳,笔记本在写我,漫天的我落在枫叶上雪花上,而你在想我。

--章怀柔



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文主要介绍了MySQL中子查询的基本用法和三种用法,包括生成参考值、内层查询与外层查询的比较操作以及使用事件号在成绩表中找到学生的分数记录。通过详细解析子查询的实例,帮助读者更好地理解和应用子查询。 ... [详细]
author-avatar
傻a2602909381
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有