当前位置: 首页 > news >正文

图文深入理解SQL语句的执行过程

  1. List item

    本文将深入介绍SQL语句的执行过程。
    一.在RDBMS(关系型DB)中,看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂,也就是说,你执行了一条诸如select count(*) where id = 001 from table_name的非常简单的语句,执行过程可能快的让你察觉不到耗时,但是就是这样一条简单的SQL语句,RDBMS在后台却为我们做了很多工作:过程如下两图所示
    在这里插入图片描述
    在这里插入图片描述
    二。在Oracle DB中,执行一条已经写入DB内存的SQL的流程如下两图(网图,谢过)所示:
    在这里插入图片描述
    在这里插入图片描述
    ‌①,将SQL语句加载入数据库缓冲区‌:首先,SQL语句被加载到数据库的缓冲区中,这是为了提高数据访问的速度和效率。
    ②,将SQL语句要操作的数据文件副本加载入数据库缓冲区‌:接下来,将要被操作的数据文件的副本也被加载到数据库缓冲区中,以便进行后续的修改操作。
    ‌③,执行SQL语句,修改数据文件副本,形成“脏缓冲区”‌:SQL语句被执行,对数据文件副本进行修改,这些被修改的数据文件副本被称为“脏缓冲区”,因为它们还未被写入到原始的数据文件中。
    ‌④,CKPT检测到“脏缓冲区”,调用DBWn‌:CKPT(Checkpoint)进程检测到“脏缓冲区”后,会调用DBWn(Database Writer)进程。
    ⑤,在DBWn运行之前,先运行LGWR,将数据文件的原始状态和数据库的改变记录到Redo Log Files‌:在DBWn运行之前,LGWR(Log Writer)进程先将数据文件的原始状态和数据库的改变记录到Redo Log Files中,这是为了确保在系统崩溃时能够恢复数据。
    ‌⑥,运行DBWn,将“脏缓冲区的内容写入到数据文件”‌:DBWn进程将“脏缓冲区”的内容写入到原始的数据文件中,完成数据的持久化存储。
    ‌⑦,同时CKPT修改控制文件和数据文件头‌:CKPT进程同时修改控制文件和数据文件头,以确保数据库的一致性和完整性。
    ⑧,SMON回收不必要的空闲资源‌:最后,SMON(System Monitor)进程回收不必要的空闲资源,以优化数据库的性能和效率。
    ⑨,如有符合的结果,则返回给users.

三.SQL执行过程中的几个重要阶段:
1.SQL解析阶段,主要介绍硬解析、软解析和软软解析
硬解析(Hard Parse)
当数据库接收到一条新的 SQL 语句时,如果该语句之前从未被执行过,数据库需要进行硬解析。硬解析的过程较为复杂和耗时,主要包括以下步骤:
1.语法分析:检查 SQL 语句的语法是否正确,确保关键字、表名、列名等的使用符合 SQL 规范。
2.语义检查:验证语句中涉及的对象(如表、视图、列等)是否存在,数据类型是否匹配,以及用户是否具有执行该语句的权限。
3.查询优化:数据库根据各种因素(如表的大小、索引的存在、数据的分布等)确定执行该 SQL 语句的最佳执行计划。这是一个复杂的过程,可能需要尝试多种执行方案并评估其成本。
4.生成执行代码:根据选定的执行计划,数据库生成可执行的代码。
硬解析需要消耗较多的数据库资源,尤其是 CPU 和内存。频繁的硬解析会严重影响数据库的性能。
软解析(Soft Parse)
如果数据库接收到一条 SQL 语句,并且该语句之前已经被执行过,并且在共享池中可以找到完全匹配的执行计划,那么数据库可以进行软解析。软解析的过程相对简单,主要包括以下步骤:
1.语法检查:快速检查 SQL 语句的语法是否正确。
2.确认执行计划:在共享池中查找与该 SQL 语句完全匹配的执行计划,并确认其仍然有效。如果执行3.计划可用,数据库可以直接使用它,无需进行查询优化。
软解析比硬解析快得多,因为它避免了查询优化的过程。软解析可以提高数据库的性能,特别是对于频繁执行的 SQL 语句。
软软解析(Soft Soft Parse)
软软解析也称为 “超快软解析” 或 “无锁软软解析”,是一种比软解析更高效的解析方式。在某些情况下,数据库可以在不获取任何锁的情况下进行软软解析,进一步减少了解析的开销。
软软解析通常发生在以下情况:
1.共享池中已经存在与当前 SQL 语句完全匹配的执行计划,并且该执行计划没有被其他会话修改或删除。
2.数据库可以直接使用该执行计划,无需进行任何额外的检查或锁定。软软解析的速度非常快,可以极大地提高数据库的性能,特别是在高并发环境下。
为了减少硬解析的次数,提高数据库性能,可以采取以下措施:
1.使用绑定变量:绑定变量可以使不同的 SQL 语句在共享池中共享执行计划,减少硬解析的发生。
2.优化 SQL 语句:确保 SQL 语句的编写高效、简洁,避免复杂的查询和不必要的操作。
3.调整数据库参数:合理调整数据库的参数,如共享池大小、游标共享等,以优化解析过程。

2.执行计划阶段做什么?
SQL 执行计划是数据库为执行特定 SQL 语句而选择的一系列步骤的描述。它详细说明了数据库将如何访问数据、进行连接操作、应用条件筛选等,以返回查询结果或执行数据修改操作。
执行计划的组成部分
1.操作步骤
执行计划由一系列操作组成,每个操作代表数据库执行的一个具体任务。常见的操作包括:
表扫描(Table Scan):数据库读取表中的数据行。可以是全表扫描(Full Table Scan),即读取表中的所有行,或者索引扫描(Index Scan),通过索引快速定位特定的行。
索引查找(Index Lookup):使用索引来查找满足条件的行。可以是唯一索引查找(Unique Index Lookup)或范围索引查找(Range Index Lookup)等。
连接操作(Join):将多个表中的数据行根据连接条件进行合并。常见的连接方式有嵌套循环连接(Nested Loops Join)、哈希连接(Hash Join)和排序合并连接(Sort Merge Join)等。
排序操作(Sort):对数据进行排序,例如在使用 ORDER BY 子句时。
聚合操作(Aggregation):执行聚合函数,如 SUM、AVG、COUNT 等。
2.操作顺序
执行计划中的操作按照特定的顺序执行。数据库根据查询的需求和数据的分布情况选择最佳的操作顺序,以最小化执行时间和资源消耗。例如,在连接操作中,数据库会选择合适的连接顺序,以减少中间结果集的大小。
3.操作成本
每个操作都有一个相关的成本估计。成本通常以数据库内部的单位(如 I/O 操作次数、CPU 时间等)来衡量。数据库在生成执行计划时,会尝试选择总成本最低的方案。成本估计基于数据库的统计信息,包括表的大小、索引的选择性、数据的分布等。
执行计划的生成过程
1.语法分析和语义检查
当数据库接收到 SQL 语句时,首先进行语法分析和语义检查,确保语句的正确性和合法性。
2.查询优化
数据库的查询优化器根据 SQL 语句和数据库的统计信息,生成多个可能的执行计划。优化器会考虑各种因素,如表的大小、索引的存在、数据的分布、连接方式等,以选择最优的执行计划。
3.成本评估
对于每个生成的执行计划,优化器会进行成本评估。成本评估基于数据库的统计信息和内部的成本模型。优化器会选择成本最低的执行计划作为最终的执行方案。
4.执行计划生成
一旦确定了最优的执行计划,数据库会生成相应的执行代码,并准备执行 SQL 语句。
查看执行计划的方法
1.EXPLAIN PLAN 语句
可以使用 EXPLAIN PLAN FOR 语句来查看 SQL 语句的执行计划。该语句会将执行计划存储在数据库的一个特定表中,可以通过查询该表来获取执行计划的详细信息。
2.SQL Developer 等工具
Oracle SQL Developer 等数据库开发工具提供了图形化的界面,可以方便地查看 SQL 语句的执行计划。这些工具通常会以树状图或表格的形式展示执行计划的各个步骤,以及相关的成本信息和统计数据。
了解 SQL 执行计划对于优化数据库性能非常重要。通过分析执行计划,可以确定 SQL 语句的执行效率,找出潜在的性能瓶颈,并采取相应的优化措施,如创建合适的索引、调整查询语句、优化数据库参数等。

码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。

相关文章:

图文深入理解SQL语句的执行过程

List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS(关系型DB)中,看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂,也就是说,你执行了一条诸如select count(*) where id 001 from table_name的非常简…...

ubuntu安装StarQuant

安装boost 下面展示一些 内联代码片。 sudo apt install libboost-all-dev -y安装libmongoc-1.0 链接: link // An highlighted block sudo apt install libmongoc-1.0-0 sudo apt install libbson-1.0 sudo apt install cmake libssl-dev libsasl2-dev编译源码 $ git clone…...

学习篇 | Jupyter 使用(notebook hub)

1. JupyterHub 1.1 快速尝试 jupyterhub -f/path/jupyter_config.py --no-ssl1.2 长期后台运行 bash -c "nohup jupyterhub -f/path/jupyter_config.py --no-ssl" > ~/jupyterhub.log 2>&1 &1.3 帮助 jupyterhub --help2. Jupyter Notebook 2.1 快…...

【裸机装机系列】8.kali(ubuntu)-虚拟内存swap交换分区扩展

推荐阅读: 1.kali(ubuntu)-为什么弃用ubuntu,而选择基于debian的kali操作系统 linux swap交换分区,相当于win系统虚拟内存的概念。当linux系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前…...

异步请求的方法以及原理

异步请求是指在发送请求后,不会阻塞程序的执行,而是继续执行后续的代码,等待请求返回后再执行相应的回调函数。常见的异步请求方法包括使用XMLHttpRequest对象(XHR)和fetch API。 异步请求的方法 1. XMLHttpRequest (X…...

SpringCloud入门(六)Nacos注册中心(下)

一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离,例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤: 1.在Nacos控制…...

【RDMA】mlxlink检查和调试连接状态及相关问题--驱动工具

简介 mlxlink工具用于检查和调试连接状态及相关问题。该工具可以用于不同的链路和电缆(包括被动、电动、收发器和背板)。 属于mft工具套件的一个工具,固件工具 Firmware Tools (MFT):https://blog.csdn.net/bandaoyu/article/details/14242…...

QT For Android开发-打开PPT文件

一、前言 需求: Qt开发Android程序过程中,点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件,非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…...

SpringBoot教程(三十) | SpringBoot集成Shiro权限框架

SpringBoot教程(三十) | SpringBoot集成Shiro权限框架 一、 什么是Shiro二、Shiro 组件核心组件其他组件 三、流程说明shiro的运行流程 四、SpringBoot 集成 Shiro (shiro-spring-boot-web-starter方式)1. 添加 Shiro 相关 maven2…...

[ffmpeg] 视频格式转换

本文主要梳理 ffmpeg 中的视频格式转换。由于上屏的数据是 rgba,编码使用的是 yuv数据,所以经常会使用到视频格式的转换。 除了使用 ffmpeg进行转换,还可以通过 libyuv 和 directX 写 shader 进行转换。 之前看到文章说 libyuv 之前是 ffmpeg…...

git-repo系列教程(3) git-repo https证书认证问题

文章目录 问题描述解决步骤1.下载证书2.测试证书是否正常3.设置环境变量 总结 问题描述 在使用git repo 同步仓库时,发现不能同步,出现如下提示错误: % Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left …...

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展:回归与回溯 中序遍历图解 首先看下中序遍历的代码,其接受一个根结点root作为参数,判断根节点是否为nil,不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …...

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条…...

在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路

什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress,添加相关配置文件,选择主题,描述,框架等 npx vitepress init //…...

神经网络面试题目

1. 批规范化(Batch Normalization)的好处都有啥?、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是:A 解析: ‌‌‌‌  batch normalization 就…...

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况,而本道题是出现两个单身狗的情况。根据一个数…...

Vue2学习笔记(03关于VueComponent)

1.school组件本质是一个名为Vuecomponent的构造函数&#xff0c;且不是程序员定义的&#xff0c;是Vue.extend生成的。 2.我们只需要写<school/>或<school></school>&#xff0c;Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new Vuecompo…...

微服务架构中常用技术框架

认证授权 Spring Security OAuth 2.0 JWT Keycloak Istio Apache Shiro 日志监控 ELK Prometheus Grafana Fluentd CI/CD Jenkins GitLab CI CircleCI ArgoCD 服务通信 gRPC REST API Apache Thrift Apache Avro Apache Dubbo OpenFegin 断路器 Hystr…...

[深度学习]Pytorch框架

1 深度学习简介 应用领域:语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年,chatGPT出现,进入AIGC发展阶段3 PyTorch框架简…...

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发&#xff0c;可在终端设备的通知中心、锁屏、横幅等展示&#xff0c;用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容&#xff0c;将通知消息分类为服务与通讯、资讯营销两大类别&…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...