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

数据库_数据库是怎样炼成的:查询处理优化篇

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数据库是怎样炼成的:查询处理优化篇相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数据库是怎样炼成的:查询处理优化篇相关的知识,希望对你有一定的参考价值。











“数据库系统中最复杂的地方有两个,一是查询优化,二是数据库引擎,著名的DDIA很大篇幅讲了存储引擎和分布式数据的概念,但对于sql数据库系统并没有侧重,所以又翻出了大学课本数据库系统概论,回顾下一些基础概念。”








本文主要介绍关系型数据库的查询处理和查询优化技术,查询优化主要分为代数优化和物理优化,代数优化指关系代数表达式的优化,物理优化指存取路径和底层操作算法的优化












01








关系型数据库的查询处理








    查询处理的任务是把用户提交给RDBMS的查询语句转化为高效的执行计划,查询处理可以分为四个阶段:查询分析、查询检查、查询优化和查询执行。




1、查询分析


    首先对查询语句进行扫描、词法分析和语法分析。识别出关键字、属性、关系名等,进行语法检查,判断语句是否符合SQL的语法规则。(词法、语法、语义分析)




2、查询检查


    对合法的查询语句进行语义检查,检查语句中的数据库对象、属性、关系是否存在和有效,还要根据数据字典中的用户权限和完整性约束定义的用户的存取权限进行检查,检查过后便把SQL转换为等价的关系代数表达式,一般使用查询树(语法分析树),来表示扩展的关系代数表达式。(这部分主要是安全性检查和完整性检查)




3、查询优化


    每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效的处理策略,按照操作的层次一般可以分为代数优化和物理优化,代数优化指按照一定的规则改变代数表达式中的操作次序和组合(关系表达式等价变换规则);物理优化则是存取路径和底层操作算法的选择。其依据可以是基于规则、代价、语义等。




4、 查询执行


    依据优化器得到的执行策略生成执行计划,由代码生成器生成执行这个查询计划的代码。   











02








查询操作的算法实例




    本节简单举例几种选择和连接操作的实现算法思想,每一种都有多种具体实现。


    


一、选择操作的实现


1、简单的全表扫描


    对查询的基本表顺序扫描,逐一检查每个元组是否满足。


2、索引扫描方法


    如果选择的属性上有索引(b树或hash),可以用索引扫描,用过先找到满足条件的元组主码,直接在查询的基本表中找到元组。


    如果是大于小于的范围操作,先找到阈值处的索引,以此为入口点在B+树的顺序集上找到所有元组指针,之后在回表。


    如果是多个条件,一是先找到这些条件的元组交集,然后回表,二是先找到一个条件的元组,回表,再继续在得到的元组中判断下一组条件。


二、连接操作的实现(只说了自然连接)


1、嵌套循环方法


    对外层循环的每一个元组,检索内存循环的每一个元组,并检查两个元组在连接属性上是否相等,直到外层的处理完。


2、排序-合并方法


    先对两个表的连接属性进行排序,然后循环外层循环表做处理,两个表都只要扫描一遍。


3、索引连接 Index Join 方法


    首先在内层循环表的连接属性上建立索引,然后循环外层表通过索引找到对应的内层表并连接起来,循环处理直到外层的元组处理完成


4、Hash Join方法


    把连接属性作为Hash码,用同一个Hash函数将两个元组集散列到同一个文件中。第一步划分阶段,对包含较少元组的表分散到Hash表的桶中。第二步试探阶段,把另一个表处理一遍,把桶中另一张表的元组连过来。
















03







关系型数据库的查询优化


示例语句:
SELECT Student.name FROM Student, Class WHERE Student.Sno = Class.Sno AND Class.Cno = '2';

判断三种情况:

1、计算广义笛卡尔积,然后在中间结果上做选择,最后在name属性上投影

2、计算自然连接,然后再中间结果上做选择,最后同样投影

3、先对Class表做选择,使用选择的结果做连接,最后投影


这三种对应不同的代数表达式,体现出代数优化的重要性,在此基础上如果Cno和Sno上有索引的话,连接过程也就不必连接基本表,而是可以使用上节提到的index join方法,这就是物理优化。







04







尾语

    代数优化和物理优化非常多,后面在续,跳过了很多基础部分,比如完整性、安全性和关系理论,着重在查询优化、数据库恢复(checkpoint)和并发控制三节,理论篇就这些了。


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
倒颠0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有