查询优化器内核剖析之产生候选执行计划执行计划成本估算

news2024/11/20 3:36:10

本篇的议题如下:

   产生候选执行计划
   执行计划成本估算

产生候选执行计划

我们知道,查询优化器的基本的目标就是为我们的查询语句找出一个比较高效的执行计划。 即使是一个非常简单的查询,也会存在很多的不同方式去访问数据,而这些不同的方式都是可以 得到相同的结果的,所以,查询优化器必须要很“明智的”从这些大量的执行计划中找出了一个 “最佳”的出来。

为了得到最好的计划,查询优化器必须在某些条件的限制下,尽可能多的创建和评估大量 的候选执行计划。看到这里,就有一点需要注意了“查询优化器是尽可能多的创建候选执行计 划”,而不是为一个查询产生所有的执行计划。在 SQL Server 中,我们把一个查询产生的候选执 行计划的集合称之为“搜索空间(search space)”。很显然,搜索空间中的所有的执行计划都返回 相同的结果。

   给一张示意图,让大家更好理解一点,如下所示:

从理论上说,为了找到最佳的执行计划的查询,基于成本的查询优化器应该生成搜索空间 中存在的所有可能的执行计划,并正确估计每个计划的成本。然而,一些复杂的查询可能有成千 上万,或者甚至数百万可能的执行计划,查询优化器不可能去产生并评估一个查询的每一个候选 的执行计划,如果那样,评估所有计划的时间会非常的长,并且严重影响查询的整体的执行时间。

查询优化器必须优化的时间和执行计划的质量之间取得平衡。例如,如果查询优化器花 1 秒钟的时间找到了一个比较好的执行计划,并且这个计划的执行时间是 1 分钟,那么这个时候, 就没有必要再去花费 5 分钟的时间去为这个查询找更优的执行计划。因此 SQL Server 不会做一个 详尽的全部查找,而是尽快找到一个合适的有效的计划。由于查询优化器是有时间限制的,那么 就可能选择的计划可能是最优方案,也有可能只是一些接近最优的方案。

候选的执行计划是在查询优化器的内部通过使用转换规则,启发式算法产生的。候选的执 行计划在优化过程中一直保存在称之为“Memo(中文翻译可能为“备忘录”,以后我们就直接使 用英文名称,很多的技术术语翻译过来之后就变味了)”的内存组件中。从这里我们就可以知道: 如果为了复杂的查询产生所有的候选执行计划势必会占用大量的内存。

我们这里只是简单的介绍一下候选执行计划的产生,后面我们会对每一个步骤进行详细的 分析。

执行计划成本估算

查询优化器需要为产生的候选的执行计划进行成本的估算,从而选择一个成本最低的。为 了估算一个计划的成本,查询优化器会使用一些成本估算的公式来计算一个计划的成本,这些成 本估算公式会考虑很多资源的使用,例如 CPU,I/O,内存等。成本估算主要是取决于算法中采用 的物理操和估算的将要处理的数据记录的量(估算数据记录的量也被称之为“基数估算”)。

为了便于进行基数估算,SQL Server 会使用并且维护统计数据(statistics),统计数据描述了 表中数据的值的分布情况,或者简单的理解为“元数据-描述数据的数据”。一旦采用基数估算得 出了吗,每个操作的成本和对资源的要求,那么查询优化器就会将这个成本数值进行累计,从而 得出整个就会的成本。我们这里不会讨论过多与统计数据相关的知识,在后面中会详细的讲述。

在下一篇文章中,我们会讲述计划的执行与缓存,以及与 Hint 相关的话题。

 

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

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

相关文章

【设备树笔记整理7】实践操作

1 使用设备树给DM9000网卡_触摸屏指定中断 1.1 修改方法 根据设备节点的compatible属性,在驱动程序中构造/注册 platform_driver,在 platform_driver 的 probe 函数中获得中断资源。 1.2 实验方法 以下是修改好的代码:第6课第1节_网卡_触摸…

1.硬件结构

1.CPU如何执行程序? 图灵机的工作方式 纸带:一个一个连续的格子存放数据; 读写头:读取纸带上格子字符,读写头上有一些部件,比如存储单元、控制单元及运算流程 1、存储单元用于存放数据; 2、控…

《向量数据库指南》——向量数据库与人工智能是一对“双生子

在信息化社会中,数据的产生、储存和处理都成为了现代生活和工作中不可或缺的一部分。在这背景下,向量数据和向量数据库出现并发展起来,为我们解决了大量的问题,但同时也引出了新的问题和挑战。 首先,我们需要明白什么是向量数据。在人工智能时代,传统的结构化数据(如文本…

C++面试题(陆)-数据库(一)

目录 数据库 1.1SQL 1.1.1 介绍一下数据库分页 1.1.2 介绍一下SQL中的聚合函数 1.1.3 表跟表是怎么关联的? 1.1.4 说一说你对外连接的了解 1.1.6 SQL中怎么将行转成列? 1.1.7 谈谈你对SQL注入的理解 1.1.8 将一张表的部分数据更新到另一张表&am…

【wireshark抓取数据包-PGSQL协议】

测试查看PGSQL协议的网络流量数据明细 1)捕获过滤的条件设置,tcp.port5432(数据库的端口) 2)上面是wireshark的主窗口,分三大主块:Packlist List(数据包列表&#xff09…

Java设计模式:四、行为型模式-10:访问者模式

一、定义:访问者模式 访问者模式:核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下,例如用户信息、雇员信息等,增加易变的业务访问逻辑。为了增强扩展性,将两部分的业务解耦的一种设计模式。 二…

422规范详解

概述: 全称为EIA-TIA-422-B,于1994年发布。 典型电路由一个发送器和N个接收器以及一个中断匹配电阻组成。 发送器: 差分输出电压值在2V~10V之间。 4.1.1 发送器输出阻抗 要求A/B之间的差分阻抗≤100Ω。 4.1.2 开路特性 要求差分电压≤…

高阶MySQL语句

数据准备 create table ky30 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5)); insert into ky30 values(1,liuyi,80,beijing,2); insert into ky30 values(2,wangwu,90,shengzheng,2); insert into ky30 values(3,lis…

手写Mybatis:第8章-把反射用到出神入化

文章目录 一、目标:元对象反射类二、设计:元对象反射类三、实现:元对象反射类3.1 工程结构3.2 元对象反射类关系图3.3 反射调用者3.3.1 统一调用者接口3.3.2 方法调用者3.3.3 getter 调用者3.3.4 setter 调用者 3.4 属性命名和分解标记3.4.1 …

Modbus TCP通信笔记

目录 1 Modbus TCP 数据协议1.1 数据格式1.2 报文头(MBAP头)1.3 功能码1.4 Modbus 地址映射到 CPU 地址 2 Modbus TCP 通讯数据示例2.1 功能码01 读离散输出线圈2.2 功能码02 读离散输入线圈2.3 功能码03 读保持寄存器2.4 功能码04 读输入寄存器2.5 功能码05 写单个离散输出寄存…

DevOps理念:开发与运维的融合

在现代软件开发领域,DevOps 不仅仅是一个流行的词汇,更是一种文化、一种哲学和一种方法论。DevOps 的核心理念是通过开发和运维之间的紧密合作,实现快速交付、高质量和持续创新。本文将深入探讨 DevOps 文化的重要性、原则以及如何在团队中实…

用Rust打印hello world!

步骤1 桌面新建1个名为 rustDemo 的文件夹(文件夹名字随便取) 步骤2 打开新建的文件夹,在地址输入栏输入 cmd 按回车键进入命令行窗口 步骤3 打开编译器,按 Ctrl S,保存文件到 rustDemo 文件夹中,保存的…

C++算法 —— 分治(1)快排

文章目录 1、颜色分类2、排序数组3、第k个最大的元素(快速选择)4、最小的k个数(快速选择) 分治,就是分而治之,把大问题划分成多个小问题,小问题再划分成更小的问题。像快排和归并排序就是分治思…

Linux网络编程 网络基础知识

目录 1.网络的历史和协议的分成 2.网络互联促成了TCP/IP协议的产生 3.网络的体系结构 4.TCP/IP协议族体系 5.网络各层的协议解释 6.网络的封包和拆包 7.网络预备知识 1.网络的历史和协议的分成 Internet-"冷战"的产物 1957年十月和十一月,前苏…

centOS下载与安装

1 下载centOS镜像 The CentOS Project 选择阿里云的镜像 2 下载虚拟机 Vmware workstation VMware - Delivering a Digital Foundation For Businesses 1 下载安装 centOs是一个操作系统,操作硬件的。所以需要有机器,可以使用虚拟机。 2 创建新的虚…

org.mockito:mockito-core 组件安全漏洞及健康度分析

组件简介 维护者mockito组织许可证类型MIT首次发布2008 年 4 月 29 日最新发布时间2023 年 8 月 27 日GitHub Star14159GitHub Fork2478依赖包24,748依赖存储库145,258 org.mockito:mockito-core是一个流行的 Java 模拟框架,它提供了一个简洁的 API 来创建和使用模拟…

【笔记】常用 js 函数

数组去重 Array.from(new Set()) 对象合并 Object.assign . 这里有个细节:当两个对象中含有key相同value不同时,会以 后面对象的key:value为准 保留小数点后几位 toFixed 注意: Number型,用该方法处理完,会…

Windows右键添加用 VSCODE 打开

1.安装VSCODE时 安装时会有个选项来添加,如下: ①将“通过code 打开“操作添加到windows资源管理器文件上下文菜单 ②将“通过code 打开”操作添加到windows资源管理器目录上下文菜单 说明:①②勾选上,可以对文件,目…

O2OA(翱途)开发平台 V8.1正式发布

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们,平台 V8.1版本已正式发布。正值8月的最后一周,我们以更安全、更高效、更好用的崭新面貌迎接9月的到来。 O2OA开发平台v8.1版本更注重于对系统级别的安全防护。其中重大的更新,是对…

Re44:数据集 GSM8K 和 论文 Training Verifiers to Solve Math Word Problems

诸神缄默不语-个人CSDN博文目录 论文全名:Training Verifiers to Solve Math Word Problems GSM8K数据集原始论文 OpenAI 2021年的工作,关注解决MWP问题(具体场景是小学(grade school)数学题)&#xff0c…