查询优化器内核剖析第一篇

news2024/11/17 3:32:08
SQL Server 的查询优化器是一个基于成本的优化器。它为一个给定的查询分析出很多的候 选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行。实际上, 因为查询优化器不可能对每一个产生的候选计划进行优化,所以查询优化器会在优化时间和查询 计划的质量之间进行一个平衡,尽可能的选择一个“最优”的计划。

所以,查询优化器成为 SQL Server 中最重要的一个组件,并且影响着 SQL Server 的性能。 选择正确或错误的执行计划意味着查询执行时间可能存在着毫秒的,几分钟,甚至几个小时之间 的差异。

了解查询优化的内部机制,可以帮助 DBA 和开发人员能够编写更好的查询,或者给查询优 化器提供信息使得它可以产生有效的执行计划。本系列文章讲述的查询优化器的内部运作的知识, 此外,还会告诉你如何使用查询优化器的相关信息进行性能诊断。

下面,我们首先来看看:查询优化器是如何工作的。

在 SQL Server 数据库引擎的核心是两个主要部分组成:存储引擎和查询处理器(也被称为 关系引擎)。存储引擎负责在磁盘和内存之间以最优化的方式读取数据,同时维护数据的完整性。 查询处理器,顾名思义,接受提交给 SQL Server 所有的查询,并且为产生他们的最佳执行计划, 然后执行该计划,并提供所需的结果。

我们将查询以 T-SQL 的形式提交给 SQL Server。因为 SQL 语句是一个高层抽象的声明性的 语言,它仅仅只是定义了要从数据库中获取什么样的数据,而没有告诉如何去获取这些数据(或 者说,没有定义获取数据的方法和步骤)。所以,对于 SQL Server 所接受到的每一个查询,查询 处理器的首要任务就是产生一个计划,这个计划就描述了如何去执行查询,之后就由存储引擎去 执行这个计划了。

   为了确保已经达到在查询处理器认为是最好的计划执行查询,查询处理器执行不同的步骤,
整个查询处理过程如图所示:

当然,上面的图只是一个最简单的示例图,下面,给大家看另外一个图,体会一下一个查 询处理的过程:

 

我们在后续的文章中会看到每一个步骤的详细讲解与应用,下面我们就简单的介绍 图中的一些步骤(为了简单起见,我们以第一幅图为例子)

1. Parsing 和 Binding(解析与绑定):在一个查询提交给了数据库之后,首先就要被进行 语法的解析,如果这个查询的语法是没有问题的,那么这个 Parsing 过程的输入结果就 是一个逻辑树,在这个逻辑树种每一个节点都表示了这个查询进行的每个操作,例如 读取某个表,进行 inner join 等。

下面,给大家看一个逻辑树的例子,对于下面的查询:

产生的逻辑树如下:

 

这个过程就是编译原理的一个文法词法的解析。

谈完了 Parsing,之后的操作就是 Binding 了,这个操作现在改名字为 Algebrizer。这个操作 主要就是检查解析产生的逻辑树中的对象是否存在,例如 Customer 是否是数据库中的表, CustomerID 字段是否在 Customer 表中等。

经过了这个 Binding 之后,就会产生另外一个树形的数据结构,传递给下一个步骤。

2. 查询优化。这个过程主要是使用上述过程中的AlgebrizerTree进行优化的处理过程, 我们这里大体的可以将这个优化的处理过程分为两个步骤:

  1. 产生执行计划。在这个过程中,查询优化器会使用之前的树,产生执行计划。 这个过程主要是将树上的逻辑操作转换为物理操作(其实就是存储引擎可以调 用的方法,这些方法就是实实在在的去读取数据的)。

  2. 估算每个执行计划的成本。一个逻辑操作可以有很多的物理操作与其对应,而 每个物理操作的成本不一样,同时,也没用所谓的“什么物理操作比其他的物 理操作更优” ,一切视情况可认定。在这个过程中产生很多的候选执行计划, 并且查询优化器会综合考虑很多的情况,选择一个它认为“比较优”的计划, 传递给存储引擎。

  3. 查询的执行与计划的缓存。这个过程比较简单了,主要是存储引擎去执行执行计划, 同时为了避免相类似的 SQL 查询重新编译,使用过的执行计划会被缓存在计划缓存池 中。

    基本是,我们可以看出,查询优化的过程就是一个将逻辑操作映射为物理操作的过程。 我们在下一篇中稍微深入的看看候选执行计划的产生以及估算它们的成本!

 

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

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

相关文章

2023-8-31 spfa求最短路

题目链接&#xff1a;spfa求最短路 #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 100010;int n, m; int h[N], w[N], e[N], ne[N], idx;int dist[N]; bool st[N];void add(int a…

360勒索病毒:了解最新变种.360,以及如何保护您的数据

引言&#xff1a; 近年来&#xff0c;网络安全威胁不断演变&#xff0c; 360 勒索病毒作为其中的一种恶意软件&#xff0c;已经对许多个人和组织的数据造成了巨大的损失。本文91数据恢复将介绍 360 勒索病毒的特点&#xff0c;探讨恢复被其加密的数据的方法&#xff0c;并分享一…

ctfshow 红包题

前言&#xff1a; 最近一直在搞java很少刷题&#xff0c;看见ctfshow的活动赶紧来复现一波~ ctfshow 红包挑战7 <?php highlight_file(__FILE__); error_reporting(2); extract($_GET); ini_set($name,$value); system("ls ".filter($_GET[1])."" )…

重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

在 Hugging Face&#xff0c;我们一直致力于提升服务安全性&#xff0c;因此&#xff0c;我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始&#xff0c;我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法&#xf…

敏感接口权限校验

前端校验 &#xff08;从前端或者从token里面拿一下&#xff09;&#xff0c;看一下用户有没有这个页面的权限&#xff08;但是一般不用&#xff0c;因为nodejs也可以写后端&#xff0c;但是放到前端去校验不安全&#xff09; 后端校验 需要梳理敏感数据接口&#xff0c;将这…

R语言图形的组合( par(),layout(),par(fig()) )

引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据&#xff0c;需要可自取 链接&#xff1a;https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…

FFDNet-pytorch版本代码训练教程

一、FFDNet-pytorch版本代码下载 (1)FFDNet-pytorch下载 https://download.csdn.net/download/qq_41104871/88233742 (2)FFDNet-pytorch版本代码运行环境配置 https://blog.csdn.net/qq_41104871/article/details/132497008 二、FFDNet-pytorch版本代码训练教程 (1)按…

H桥驱动电路的反向电动势的吸收

下图是应用于智能灌溉系统驱动脉冲电动阀的H桥电路&#xff0c;有一个小问题。 H桥驱动电路 由于电动阀的线圈呈现感性。当正向或者反向驱动信号断开时&#xff0c;流过线圈的电流不能突变。 在线圈两端会产生与驱动信号反相的反向电动势。 驱动信号断开时&#xff0c;线圈产生…

是否在业务中使用大语言模型?

ChatGPT取得了巨大的成功&#xff0c;在短短一个月内就获得了1亿用户&#xff0c;并激发了企业和专业人士对如何在他们的组织中利用这一工具的兴趣和好奇心。 但LLM究竟是什么&#xff0c;它们如何使你的企业受益?它只是一种炒作&#xff0c;还是会长期存在? 在这篇文章中我…

行业追踪,2023-08-31

自动复盘 2023-08-31 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

记录生僻字编码问题

目录 生僻字消失?hexdump 生僻字消失? 前段时间遇到一个问题&#xff0c;对方系统确认推送的文件里客户姓名为3个字&#xff1a;倪明&#xff0c;中间字如下&#xff1a; PS: 忽略上面的编码哈&#xff0c;只看汉字 且文件为UTF8格式&#xff0c;本系统接收后转码为GB18030…

BMC相关知识

简介 BMC&#xff08;Baseboard Management Controller&#xff09;&#xff0c;基板管理控制器&#xff0c;普通PC没有&#xff0c;服务器产品必备。BMC是一个独立的系统&#xff0c;只要通电即可运行&#xff0c;服务器无需开机&#xff0c;不依赖其它软硬件&#xff0c;如O…

代价高昂的 IT 错误:识别并避免供应商锁定

陷入不提供所需服务的云服务器合同中可能会非常痛苦、令人沮丧且成本高昂。 供应商锁定是提供商难以切换的地方&#xff0c;这意味着企业迁移到新供应商的成本太高、破坏性太大或耗时。 这使得公司受到供应商的摆布&#xff0c;尽管该服务可能无法提供他们所需的可靠性或可扩…

解决“Windows Terminal软件报0xd000003a“问题

在2019年5月&#xff0c;微软发布第一个版本的Microsoft Terminal软件&#xff0c;支持tab分页、Shell脚本、bat脚本等。Terminal比DOS更方便&#xff0c;命令也更丰富&#xff0c;支持UTF-8字体、主题样式定制、窗格、快捷方式等等。     在win10上&#xff0c;打开Microsof…

PSP - 蛋白质结构预测 OpenFold Multimer 重构训练模型的数据加载

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132602155 OpenFold Multimer 在训练过程的数据加载时&#xff0c;需要将 MSA 与 Template 信息转换成 Feature&#xff0c;再进行训练&#xff0…

【源码】智能导诊系统:医疗行业的变革者

智能导诊系统源码&#xff0c;3D人体导诊系统源码 随着科技的迅速发展&#xff0c;人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中&#xff0c;智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用&#xff0c…

计算机毕业设计之基于Python+MySQL的健身房管理系统(文档+源码+部署教程)

系统主要采用python技术和MySQL数据库技术以及Django框架进行开发。系统主要包括个人中心、用户管理、教练管理、健身课程管理、健身器材管理、健身记录管理、身体数据管理、在线留言、系统管理、订单管理等功能&#xff0c;从而实现智能化的健身房管理方式&#xff0c;提高健身…

DatenLord前沿技术分享No.34

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;通过软硬件深度融合的方式打通云云壁垒&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…

Jenkins测试报告样式优化

方式一&#xff1a;修改Content Security Policy&#xff08;临时解决&#xff0c;Jenkins重启后失效) 1、jenkins首页—>ManageJenkins—>Tools and Actions标题下—>Script Console 2、粘贴脚本输入框中&#xff1a;System.setProperty("hudson.model.Directo…

Java中转换流(InputStreamReader,OutputStreamWriter),打印流(PrintStream,PrintWriter)

转换流 InputStreamReader 和 OutputStreamWriter 是 Java 中用于字符流和字节流之间进行转换的转换流类。它们主要用于解决字符编码的问题&#xff0c;在字节流和字符流之间提供了桥梁&#xff0c;可以将字节流转换为字符流或将字符流转换为字节流。 InputStreamReader&#…