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

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.rhkb.cn/news/114405.html

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

相关文章

IDEA集成Git相关操作知识(pull、push、clone)

一:集成git 1:初始化git(新版本默认初始化) 老版本若没有,点击VCS,选中import into Version Controller中的Create git Repository(创建git仓库),同理即可出现git符号。 也可查看源文件夹有没有…

【力扣每日一题】2023.8.30 到家的最少跳跃次数

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一只跳蚤,我们可以操控它前跳 a 格或是后跳 b 格,不能跳到小于0的位置,有一些被禁止的点不…

系统架构设计高级技能 · Web架构

现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 Web架构 一、Web架构介绍1.1 Web架构涉及技术1.2 单台服务…

【JAVA】什么是异常

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 异常 1. 什么是异常1.1 概念1.2 异常的体…

函数名称add 与 add 作为参数传入的区别与探讨

在C和C中,函数名本身就是一个指向该函数代码的指针。因此,当你以函数名作为参数传递给其他函数时,实际上你传递的是该函数的地址。 对于你的代码,add是一个函数,&add是该函数的地址。由于add本身就代表了函数的地…

深圳产品展示视频拍摄一站式服务

产品展示视频拍摄一站式服务是指一家专业的拍摄制作公司或团队提供从策划、拍摄到后期制作的全方位服务,以满足客户的产品展示需求。这种服务通常包括以下方面,由产品展示视频制作公司老友记小编从以下几个方面为您整理: 1.策划和预制阶段&a…

RSA算法与错误敏感攻击

参见《RSA 算法的错误敏感攻击研究与实践》 RSA 算法简介 RSA 算法原理: 1) RSA 算法密钥产生过程 (1)系统随机产生两个大素数 p p p 和 q q q,对这两个数据保密; (2)计算 n p …

小米面试题——不用加减乘除计算两数之和

前言 (1)刷B站看到一个面试题,不用加减乘除计算两数之和。 (2)当时我看到这个题目,第一反应就是感觉这是一个数电题目。不过需要采用C语言的方式编写出来。 (3)不过看到大佬的代码之…

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

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

【高性能计算】opencl语法及相关概念(四):结合opencv进行图像高斯模糊处理

目录 高斯模糊简介主函数:host端设备端函数:mywork.cl效果图对比 高斯模糊简介 高斯模糊是一种常用的图像处理技术,用于减少图像中的噪点和细节,并实现图像的平滑效果。它是基于高斯函数的卷积操作,通过对每个像素周围…

亚马逊美国站上半年“日本商店”畅销品类了解一下吧!

近日,亚马逊美国站公布了2023年上半年“日本商店”(JAPAN STORE)的热门品类以及各品类销量排名前三的商品。据了解,亚马逊与日本贸易振兴机构 (JETRO) 合作,于2021年11月推出“日本商店”,支持日本卖家出海…

Ansible之playbooks剧本

文章目录 一.playbooks介绍1.playbooks简述2.playbooks剧本格式3.playbooks组成部分4.运行playbooks及检测文件配置 二.模块实战实例1.playbooks模块实战实例2.vars模块实战实例3.指定远程主机sudo切换用户4.when模块实战实例5.with_items迭代模块实战实例6.Templates 模块实战…

Unity 之 参数类型之值类型参数的用法

文章目录 基本数据类型结构体结构体的进一步补充 总结: 当谈论值类型参数时,我们可以从基本数据类型和结构体两个方面详细解释。值类型参数指的是以值的形式传递给函数或方法的数据,而不是引用。 基本数据类型 基本数据类型的值类型参数&…

vue去掉循环数组中的最后一组的某个样式style/class

vue去掉循环数组中的最后一组的某个样式style/class 需求:要实现这样的排列 现状 发现,最后一个格子并没有跟下面绿色线对齐。 最后发现 是因为 每个格子都给了 margin-right:36px,影响到了最后一个格子 所以要 将最后一个格子的…

OpenCV(十一):图像仿射变换

目录 1.图像仿射变换介绍 仿射变换: 仿射变换矩阵: 仿射变换公式: 2.仿射变换函数 仿射变换函数:warpAffine() 图像旋转:getRotationMatrix2D() 计算仿射变换矩阵:getAffineTransform() 3.demo 1.…

浅谈城市轨道交通视频监控与AI视频智能分析解决方案

一、背景分析 地铁作为重要的公共场所交通枢纽,流动性非常高、人员大量聚集,轨道交通需要利用视频监控系统来实现全程、全方位的安全防范,这也是保证地铁行车组织和安全的重要手段。调度员和车站值班员通过系统监管列车运行、客流情况、变电…

【Vue】集成百度地图

Vue 集成 百度地图 1、获取百度地图 ak 密钥 2、登录网址 https://lbsyun.baidu.com/ 3、注册百度地图开放平台账号,填写认证信息,并且创建应用 安装 npm install vue-baidu-map --savemain.js import BaiduMap from vue-baidu-map;Vue.use(BaiduM…

mybatisPlus多数据源方案

背景 在微服务李娜一般一个服务只有一个数据源,但是在有的老项目或者一些特定场景需要多数据源链接不同的数据库,本文以mybatisPlus为基础给出解决方案 多数据源场景分类 情形一:项目启动就确定了情形一:一些sass系统里面动态确…

[管理与领导-63]:IT基层管理者 - 潜技能 - 1 - 职场中的陷阱 - 看清楚职场中的霸凌现象

目录 前言: 1:打击自尊心 2:孤立他人 3:恶意针对 4:当众羞辱 5:持续性否定 前言: 职场中,什么样的人都有。 害人之心不可有,防人之心不可无。 前者教人从善&…

chatGPT训练过程

强化学习基础 强化学习是指智能体在不确定环境中最大化其获得的奖励从而达到自主决策的目的。其执行过程为:智能体依据策略决策从而执行动作,然后感知环境获取环境的状态,进而得到奖励(以便下次再到相同状态时能采取更优的动作),…