数据库中的SQL是如何执行的?

这篇具有很好参考价值的文章主要介绍了数据库中的SQL是如何执行的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

参考文献:03丨学会用数据库的方式思考SQL是如何执行的

以oracle和MySQL为例,讲解了sql是怎么被执行的,并且对比了执行过程中,oracle和MySQL的异同。

个人感觉,讲解的核心是SQL执行时的缓存机制。

Oracle中的sql是如何执行的

自我口述一下

sql语句在提交后,

首先进行“语法检查”,检查sql语法是否正确,关键字等的拼写是否异常;

然后进行“语义检查”,检查sql中涉及到的访问对象是否存在,比如说from的表,或者是select的字段等。

语法检查和语义检查是为了避免sql语句本身出现错误,保证sql语句是可以运行的。

然后进行“权限检查”,检查当前用户是否有所调用表的访问权限,是否可以访问这些数据。

然后进行“共享池检查”, 这一步是检查sql语句及其执行计划是否缓存在共享池中,如果当前有缓存,就将它们取出来,这个过程被称为sql语句的软解析;如果该语句和其对应的执行计划没有缓存过,那sql语句将被送进“优化器”,创建解析树对其解析,同时生成执行计划,这个过程被称为硬解析

在执行计划就位后,就知道了sql该怎么被执行,这时候再进行“执行器”阶段,执行sql语句,返回执行结果。

数据库中的SQL是如何执行的?

共享池(shared pool)是oracle中的术语,是一块内存池,包括了库缓存区数据字典缓存区。库缓存区主要是用来缓存sql语句和其执行计划,数据字典缓存区存储的是Oracle中各种对象,如表、视图、索引等对象,其缓存细粒度更小,但也更实用,当对sql语句进行解析的时候,如果需要相应的对象,那直接去数据字典缓存区去找。

那库缓存过程中,Oracle是怎么进行软解析的呢?

Oracle首先对SQL语句做hash运算,然后根据得到的hash值,在库缓存(library Cache)中查找,找得到就取出来,做软解析,找不到的话那就只能硬解析。

为了提升sql的执行效率,我们应该尽量避免硬解析,因为在sql的执行过程中,创建解析树,生成执行计划是相当耗资源的。

那在Oracle中,如何主动避免使用硬解析呢?

Oracle提供了一种方法,就是绑定变量

Oracle中使用绑定变量来避免一类执行计划的无谓消耗。

在Oracle中,以下两个sql语句是会生成两套执行计划的,即使这两套执行计划是一模一样的:

select * from player where player_id = 1001

select * from player where player_id = 1002

只要后面的常数变了,那么每一次查询都会创建一个新的查询解析。这种花销是不必要的,于是Oracle提出了绑定变量:

select * from player where player_id = :player_id

采用了绑定变量后,在第一次查询后,共享池中就会缓存此类查询的执行计划,主动避免了下次的硬解析。

简单百度了下,Oracle中应该是大量使用绑定变量来主动避免硬解析。但并不是说绑定变量就是万能的,这种类似动态sql的方式,可能过于固化,优化的话也比较难。

当然,以上是官方说法,我不是很懂,只是下意识觉得过于僵硬,不容易变通

MySQL中的sql是如何执行的

Mysql的执行过程跟Oracle有相同的地方,也有不同的地方。

sql语句送入后,

首先进行缓存查询,如果缓存中有这条sql语句,那就直接把结果返回给客户端;如果没有,则进入解析器阶段。需要特殊说明的是,这种缓存查询方式效率不高,在MySQL8.0后就被抛弃了

至于为什么说它查询效率不高,原因很简单。每次表发生变动后,比如说加入了新数据,原先依赖这张表的缓存查询就全部失效被清空,而大部分表实际上都是在时刻变动的,这种缓存机制只对不会更新的静态表有作用,对实时更新的动态表来说,这种缓存机制的作用反而是负面的,反而增加了sql的查询时间,毕竟每次运行完后还要花时间缓存一下结果,哪怕下一秒这个结果就没用了。

解析器阶段,会做语法分析和语义分析;

然后是优化器阶段,确定执行计划;

然后是执行器阶段,执行前会先进行权限鉴定,判断该用户是否具备查询权限。如果具备,则执行sql并返回结果。如果是MySQL8.0以下的版本,如果设置了查询缓存,则会同时将查询结果进行缓存。

数据库中的SQL是如何执行的?

可以看到,MySQL和Oracle的执行流程大体上是相同的,或者说执行思路是相同的。

不同的地方主要是MySQL的引擎特性引起的。MySQL作为一种优秀的开源数据库,其数据引擎采用插件的方式,提供了多种引擎可供选择,甚至,还允许开发人员设置自己的开发引擎。一些具体的开发引擎就不介绍了,放个简单的截图吧。
数据库中的SQL是如何执行的?

需要注意的一点是,MySQL中每个表的设计都可以采用不同的数据库引擎,你完全可以根据表本身的特性,灵活选择其对应的数据库引擎,这也是MySQL的强大之处

另一个需要提的是,如何在sql中查看每一句sql在执行时所使用的资源和时间等信息。即使用profiling。具体用法就不提了,需要用到的时候自己查吧。文章来源地址https://www.toymoban.com/news/detail-488343.html

到了这里,关于数据库中的SQL是如何执行的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Navicat中导入数据库SQL脚本并执行

    Navicat中导入数据库SQL脚本并执行

    1、打开Navicat数据库管理工具; 2、点击菜单栏上的“工具”,选择“命令列界面”; 打开了命令列界面 3、复制sql脚本到命令列界面内,按enter(回车)执行,会发现执行成功的OK返回消息,如下所示: 4、刷新,否则无法看到新增的数据库、数据表、数据表中的记录

    2024年02月11日
    浏览(39)
  • postgresql|数据库|批量执行SQL脚本文件的shell脚本

    postgresql|数据库|批量执行SQL脚本文件的shell脚本

    对于数据库的维护而言,肯定是有SQL脚本的执行,例如,某个项目需要更新,那么,可能会有很多的SQL脚本需要执行,SQL脚本可能会包含有建表,插入数据,索引建立,约束建立,主外键建立等等内容。 那么,几个SQL脚本可能无所谓,navicat或者psql命令行 简简单单的就导入了

    2024年02月01日
    浏览(38)
  • 【Sql】sql server数据库提示:执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。

    【Sql】sql server数据库提示:执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。

    【问题描述】 打开sql server2008r2数据库的时候, 系统提示执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。 【概念理解】 首先MSDB数据库是的作用: 用于给SQL Server代理提供必要的信息来运行调度警报、作业及记录操作。同时也会记录数据库的备份和

    2024年02月04日
    浏览(45)
  • SQL Server数据库判断最近一次的备份执行结果

    SQL Server数据库判断最近一次的备份执行结果

    在SQL Server的官方文档里面可以看到备份和还原的表,但是这些表里面只能找到备份成功的相关信息,无法找到备份失败的记录,比如 msdb.dbo.backupset 。对于一些监控系统未监控作业的情况下,想要监控数据库备份任务执行失败而触发告警规则,有些麻烦。 但是SQL server内部是

    2024年02月03日
    浏览(11)
  • PostgreSQL数据库命令行执行SQL脚本的三种方式

    PostgreSQL数据库命令行执行SQL脚本的三种方式

    生成环境中,出于安全性等原因,往往不提供数据库连接工具,所以对数据库的更新和升级就得通过命令行来实现。本文总结了三种命令行执行sql脚本的方式。 命令格式: psql [option…] [dbname] [username] 常用参数介绍: -h:指定IP地址或主机名。 -p:指定端口,默认为5432。 -U:

    2024年02月11日
    浏览(15)
  • mapper.xml中循环执行多条语句时报错,但是单独拿SQL到数据库却可以执行

    mapper.xml中循环执行多条语句时报错,但是单独拿SQL到数据库却可以执行

    我是批量修改数据,用foreach标签包住update语句,报错信息如下: 最后解决,在数据源配置中添加参数:

    2024年02月12日
    浏览(12)
  • Oracle数据库SQL*Plus命令行执行SQL语句时,中文乱码报错解决方法

    Oracle数据库SQL*Plus命令行执行SQL语句时,中文乱码报错解决方法

    🎉欢迎来到Java学习路线专栏~Oracle数据库SQL*Plus命令行执行SQL语句时,中文乱码报错解决方法 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java学习路线 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹

    2024年01月22日
    浏览(9)
  • 自己动手做数据库系统:解释执行 update 和 delete 对应的 sql 语句

    在上一节我们完成了 select 语句的解释执行,本节我们看看 Update 和 Delete 对应的语句如何解释执行,当然他们的实现原理跟我们前面实现的 select 语句执行大同小异。无论是 update还是 delete 都是对数据表的修改,因此他们的实现方法基本相同。 假设我们要执行如下 sql 语句:

    2024年01月22日
    浏览(12)
  • 【云原生技术】云计算中的数据库数据传输服务简介

    云计算中的数据库数据传输服务是指用于在不同数据库环境之间迁移和同步数据的服务。这些服务通常由云服务提供商提供,用于帮助用户将他们的数据从本地数据库迁移到云数据库,或者在不同的云数据库之间迁移数据。这些服务关键在于确保数据迁移的安全性、高效性和

    2024年01月23日
    浏览(8)
  • 【JaveWeb教程】(17) MySQL数据库开发之 MySQL简介、安装、数据类型、SQL通用语法 详细代码示例讲解

    【JaveWeb教程】(17) MySQL数据库开发之 MySQL简介、安装、数据类型、SQL通用语法 详细代码示例讲解

    在我们讲解SpringBootWeb基础知识(请求响应案例)的时候,我们讲到在web开发中,为了应用程序职责单一,方便维护,我们一般将web应用程序分为三层,即:Controller、Service、Dao 。 之前我们的案例中,是这样子的请求流程:浏览器发起请求,先请求Controller;Controller接收到请求之

    2024年01月25日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包