SQL进阶理论篇(十三):数据库的查询优化器是什么?

文章目录

  • 简介
  • 什么是查询优化器
  • 查询优化器的两种优化方式
  • 总结
  • 参考文献

简介

事务可以让数据库在增删改查的过程中,保证数据的正确性和安全性,而索引可以帮数据库提升数据的查找效率。查询优化器,则是帮助我们获取更高的SQL查询性能。

本节我们将简单过一下查询优化器的原理,主要包括以下几部分:

  • 什么是查询优化器?具体的流程和环节?
  • 查询优化器的两种优化方式是什么?

什么是查询优化器

一条SQL语句的执行,一般会经过以下环节,如图:

在这里插入图片描述

语法分析:检查SQL拼写和语法是否有问题。

语义检查:检查SQL语句中的访问对象是否存在,即表名、列名啥的;

经过语法分析和语义检查无误之后,就会生成一棵语法分析树,进行优化器优化,生成查询计划。

所以,查询优化器的目标就是找到当前SQL查询的最佳执行计划(或者说查询树),它是由一系列物理操作符组成,这些操作符按照一定的运算关系组成查询的执行计划。

而在查询优化器中,可以分为逻辑优化阶段物理优化阶段

在这里插入图片描述

逻辑优化,就是通过改变SQL语句的内容来使得查询更加高效,并为物理优化阶段提供更多的候选执行计划。

那逻辑优化是如何改变SQL语句的内容呢?

通常采用的方式是对SQL语句进行等价变换,(基于关系代数)做查询重写。比如说,对条件表达式做等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行外连接消除、嵌套连接消除等。

逻辑优化中的每一步都对应着物理计算,因此逻辑优化阶段输出若干候选执行计划之后,物理优化阶段会计算这些计划的代价,从中选择代价最小的作为执行计划。

因此逻辑优化属于语法层级的优化,而物理优化实际上是一种依据代价的估算模型,相当于是从连接路径中选择代价最小的路径,因此属于物理层面的优化。

查询优化器的两种优化方式

查询优化器的目的是生成最佳的执行计划,那什么是最佳,如何生成最佳执行计划?通常有两种策略:

  • 基于规则的优化器(RBO,Rule-Based Optimizer)
  • 基于代价的优化器(CBO,Cost-Based Optimizer)

什么是基于规则的优化器?

规则就是先验知识,是人们以往的经验,或者是被证明已经是有效的方式。

通过在优化器里嵌入规则,来判断输入的SQL查询符合哪种规则,符合哪种就按照对应的规则来制定执行计划,同时采用启发式规则去掉明显不好的存取路径。

什么是基于代价的优化器?

根据代价评估模型,计算每条候选执行计划的代价,就是cost,优化器会从中选择代价最小的一条执行计划作为最佳执行计划。

相比RBO来说,CBO对数据更加敏感,因为它会利用数据表中的统计信息做判断。针对不同的数据表,相同的查询得到的执行计划可能是不同的两种优化器的最大差异),因此制定出来的执行计划更符合数据表的实际情况。

RBO,相同查询的规则是相同的,因此对于不同的数据表,得到的执行计划基本是一样的

需要注意,在优化器中会存在各种组合的可能。比如说我们需要优化器来制定数据表的扫描方式、连接方式以及连接顺序等。

总结

优化器的两个阶段:逻辑优化阶段和物理优化阶段。

逻辑优化阶段是对查询语句进行重写,并输出多种候选的最佳计划。物理阶段是从多种候选计划里,找出代价最小的计划。

优化器的两种优化方式:基于规则的RBO和基于代价的CBO。

RBO是根据固有的规则来给出执行计划,很简单的一个模型,对于不同表上的相同查询,RBO可能会返回相同的执行计划,但是CBO会考虑表的数据量等条件,返回不同的执行计划。因此CBO更加贴合实际一些。

参考文献

  1. 32丨查询优化器是如何工作的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

具有超低功耗性能的R7F102GAC3CSP、R7F102GAC2DSP、R7F102G6C3CSP RL78/G22微控制器 16-bit MCU

RL78/G22 简介: 除了具有低电流消耗(CPU工作时:37.5μA/MHz;STOP时:200nA)外,RL78/G22微控制器还配备了丰富的电容触摸通道。完备的16-48引脚封装和32KB-64KB闪存,扩充了新一代RL78…

Java如何开发PC客户端(Windows,Mac,Linux)

项目编译工具:Gradle开发工具: Idea开发语言: 建议java17以上ui组件:openjfx (org.openjfx.javafxplugin)打包工具: jpackage (org.beryx.jlink) 一、如何解决打包问题 java 14以后,有了jpackage工具,能够…

计算机网络 运输层上 | 运输层概述 UDP协议 端口 套接字

文章目录 1 运输层概述1.1 运输层存在的意义1.2 运输层协议概述1.3 主要端口号 2 运输层主要协议 UDP2.1 UDP的特点2.2 UDP首部格式2.3 UDP工作流 1 运输层概述 1.1 运输层存在的意义 之前我们讲网络层的时候,已经可以将信息从一个主机传递到另一个主机了。 那么…

CSS3新增样式

1,圆角边框 在CSS3中,新增了圆角边框样式,这样我们的盒子就可以变圆角了 border-radious属性用于设置元素的外边框圆角 语法: border-radious:length; radious 半径(圆的半径)原理…

校园圈子交友系统,APP小程序H5,三端源码交付,支持二开!实名认证,大V认证,地图找伴,二手平台!

校园圈子交友系统,是属于自主定义开发的系统,内容有很多,先截取一些给大家看看,让大家更多的了解本系统,然后再做评价! 校园后端下载地址:校园圈子系统小程序,校园拼车,校…

XM平台官网开户注册流程图解

注册前准备 在进行XM外汇官网注册之前,首先需要准备必要的信息,包括个人身份信息、联系方式以及相关财务信息。确保这些信息的准确性是保证注册流程顺利进行的关键。 一、要访问XM外汇官方网站,首先打开您的浏览器。在浏览器的地址栏中输入…

数据分析基础之《numpy(6)—合并与分割》

了解即可,用panads 一、作用 实现数据的切分和合并,将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

【Linux】macOS下使用scp命令编写脚本上传文件至服务器

使用时需要输入服务器密码 #!/bin/bash# 检查传递给脚本的参数数量 if [ "$#" -ne 2 ]; thenecho "Usage: $0 <本地文件路径> <服务器文件夹路径>"exit 1 fi# 接收命令行参数 local_file"$1" remote_path"$2"# 定义远程服…

华为OS与麒麟OS:华为自研操作系统的对决

导言 在移动操作系统领域&#xff0c;华为OS和麒麟OS代表了华为在自主研发方面的努力。本文将深入探讨这两个操作系统的特点、竞争关系以及它们在用户体验、生态系统建设等方面的差异。 1. 背景与起源 华为OS的诞生&#xff1a; 华为OS是华为公司为应对外部环境而自主…

英国呼叫中心的功能

随着互联网的普及和信息技术的发展&#xff0c;越来越多的企业需要通过呼叫中心来管理客户关系和提供售后服务。英国作为主要的海外外贸市场之一&#xff0c;也是呼叫中心面向客户服务的重要国家。 英国呼叫中心的功能 英国呼叫中心的功能大致分为四类&#xff1a;接听电话、…

PCL 点云匹配 3 之 (非线性迭代点云匹配)lM-ICP

一、IM迭代法 PCL IterativeClosestPointNonLinear 非线性L-M迭代法-CSDN博客 Matlab 非线性迭代法&#xff08;3&#xff09;阻尼牛顿法 L-M-CSDN博客 MATLAB实现最小二乘法_matlab最小二乘法-CSDN博客

开源键盘工程QMK

一、Qmk简介 目录 一、Qmk简介 二、Qmk入门指导文档 三、QMK配置器 四、QMK层的概念 TMK原先是由Jun Wako设计实现

爬虫工作量由小到大的思维转变---<第十八章 Scrapy请求处理与返回策略>

前言: 今天我们来聊一聊Scrapy爬虫中的请求处理与返回策略。你有没有遇到过一个Item需要由多个请求组成的情况&#xff1f;如果是的话&#xff0c;那么对请求的处理和决定是否返回处理过的Item对象就变得格外重要。看一下Scrapy中的相关策略&#xff0c;实现爬虫的完美康复。 …

解锁商业宝藏:迅软科技答疑保护商业秘密的重要性

商业秘密指不为公众所知悉、具有商业价值并经权利人采取相应保密措施的技术信息、经营信息等商业信息&#xff0c;一旦泄露可能会给公司带来极大的经济损失和竞争压力&#xff0c;保护商业秘密既能维护企业自身合法权益&#xff0c;也能保障市场经济长期健康发展需求。 保护商…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表)

一、模型user对象>和数据库的字段关联 & 自动生成 【其中涉及删除表数据&#xff0c;一切又从零开始】 二、模型user对象>和数据库的字段关联 2.1在model文件夹下&#xff0c;新建 user对象 2.1.1 概念 大家可以想象我们现在的数据是存储在数据库里的&…

【Spring Security】打造安全无忧的Web应用--入门篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Security是什么 1.概…

【Java】BigDecimal 比较自动化页面获取数据的大小

jwensh2023.12.20 使用背景 对 web3 相关的数据进行计算的时候&#xff0c;需要进行大小加减计算&#xff0c;UI 自动化过程需要将数据转为自然数&#xff1b;页面获取的数据会有千分位 、高精度(18位) /*** Compares this {code BigDecimal} with the specified* {code BigDe…

Open CV 图像处理基础:(二)从基本概念到实践操作

Open CV 图像处理基础&#xff1a;从基本概念到实践操作 一、引言 图像处理是计算机视觉领域的一个重要分支&#xff0c;它涉及对图像的各种操作和处理。了解图像的基本概念、读取和显示方法以及基本操作是图像处理的基础。本文将通过示例文章的形式&#xff0c;帮助初学者逐…

Spring Boot3通过GraalVM生成exe执行文件

一、安装GraalVM 1、官网&#xff1a;https://www.graalvm.org/downloads/ 2、配置环境变量 2.1、环境变量必须使用JAVA_HOME&#xff0c;否则会出现问题 2.2、在系统变量配置Path,%JAVA_HOME%\bin&#xff0c;注意必须放在顶部第一位 2.3、配置jdk的环境变量&#xff0c;在P…

【Spring实战】创建第一个项目

文章目录 使用 Spring Initializr 创建第一个项目1. 打开官网2. 填写信息3. 生成工程4. 解压工程5. 导入 IDEA6. 编写 Hello world7. 启动项目8. 访问验证9. 详细代码最后 Spring 是一个强大且广泛使用的 Java 开发框架&#xff0c;提供了全面的基础设施和工具&#xff0c;用于…