查询优化器内核剖析之查询的执行与计划的缓存 Hint 提示

本篇议题如下:
查询的执行与计划的缓存
Hint 提示

首先看到第一个议题

查询的执行与计划的缓存

一旦查询被优化之后,存储引擎就使用选中的执行计划将结果返回,而被使用的这个执行 计划就会被保存在内存中一个被称之为“计划缓存”的地方,从而使得这个执行计划可以被重用, 从而节省 CPU 等资源。

尽管我们可以把执行计划缓存起来,便于重用,但是在某些情况,对于某些查询而言,计 划重用并不是很好的选择。这是为什么?这主要取决于表中数据的分布情况和查询中所使用的参 数,其实这种情况也被称为“参数嗅探(Parameter Sniffing,翻译过来还是很别扭的)”。

这里,我们就简单的说一下(详细的后续文章会慢慢的介绍)。例如,假设有这样一个查 询语句,如下图所示:

执行如下:

这个时候,存储过程运行,产生了一个执行计划,并且被缓存起来了。
   之后,又要运行这个查询,但是传入的参数不同,如下:

这个时候,这个查询可以使用之前创建的执行计划,但是这个时候也很有可能之前的执行 计划对与参数 870 不是最优化的。因为之前在生成的执行计划的时候,查询优化器是通过传入的 897 创建的执行计划。

试想:如果在表中的数据,有很多的 ProductId 的值都为 897,即使我们在 ProductId 上面 建立了索引,但是还有可能查询优化器决定在执行计划会采用扫描整表来获取数据。而对于参数 值为 870 的时候,在表中的存在相同的 ProductId 为 870 的数据很少,这个时候,如果采用索引 查找,可能会更快,那么就说明之前的执行计划中的整表扫描不适合了!

当然,这里只是简要的说明了一下,大家可能不是非常的明白,没关系,只要知道有这么 个情况就行了,我们在后面会详细剖析。

有时候,即使执行计划已经在计划缓存中存在了,但是有可能随着一些元数据的改变(修 改表的结构,移除索引等操作)会导致执行计划失效,或者不是比较优化的,或者甚至从计划缓 存中移除。当 SQL Server 存在内存压力的时候,一些执行计划也会被移除,释放内存。

Hint 提示

   在大部分情况下,查询优化器都会选择比较高效的执行计划,

但是,在有些情况下,查询优化器选择的执行计划没有达到预期的效果,或者说,查询优 化器做出了错误的选择。造成这个问题的原因是我们没有为 SQL Server 提供准确的信息,例如数 据库的统计信息过期了。

同时,在有些情况下,我们根据我们的经验和分析判断,发现 SQL Server 选择的执行计划 不是我们想要的。

当遇到上面的情况的时候,我们就可以给查询优化器一些提示信息,去告诉它该如何产生 执行计划,也就是我们自动的去干预查询优化器的默认行为。

   为了让大家有一个感性的认识,我这里举一个例子,对于下面的查询:

 

我们通过查询它的执行计划,如下图所示:

 

我们发现,这个查询计划不够高效,于是我们改写查询语句,如下:

在语句中,我们强制的使得查询优化器选择我们要的连接方式,

 执行计划如下:

 

大家如果对这里的知识不明白,没有关系,这里的例子只是让大家感受一下。

注意:一般情况下,我们没有必要去干扰查询优化器的工作,因为它会已经足够的“智能” 去选择更好的执行计划,除非我们非常有信心,并且证明我们用一些 Hint 会提升性能,这个时候, 我们可以加入 Hint。事实是,我们加入的 Hint 都是会产生很多的问题。

本篇就暂时到这里!后一篇文章就稍微详细一点的来看看与执行计划相关的一些话题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【负载均衡】常见的负载均衡策略有哪些?

文章目录 前言负载均衡分类常见负载均衡策略小结 前言 负载均衡策略是实现负载均衡器的关键,而负载均衡器又是分布式系统中不可或缺的重要组件。使用它有助于提高系统的整体性能、可用性、可靠性和安全性,同时支持系统的扩展和故障容忍性。对于处理大量…

Linux常用命令——cupsdisable命令

在线Linux命令查询工具 cupsdisable 停止指定的打印机 补充说明 cupsdisable命令用于停止指定的打印机。 语法 cupsdisable(选项)(参数)选项 -E:当连接到服务器时强制使用加密; -U:指定连接服务器时使用的用户名; -u&#…

程序开发:构建功能强大的应用的艺术

程序开发是在今天的数字化时代中扮演重要角色的一项技术。通过编写代码,开发人员能创造出无数不同的应用,从简单的计算器到复杂的社交平台。电子商务应用、在线教育平台、医疗记录系统等,都重视程序开发的重要性,通过这其中的交互…

[C/C++]天天酷跑超详细教程-中篇

个人主页:北海 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C/C🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!&#x1f9…

【08期】ArrayList常见面试题

简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。 线程安全性 对ArrayList的操作…

Linux整合seata

1、到官网下载seata,这里以ZIP为例 2、使用远程工具上传ZIP包 3、通过命令解压 unzip seata-server-1.7.0.zip4、修改配置文件、新建表,参考我之前的文章 分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos…

2023开学礼新疆理工学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》许少辉新财经理工

2023开学礼新疆理工学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》许少辉新财经理工

怎样来实现流量削峰方案

削峰从本质上来说就是更多地延缓用户请求,以及层层过滤用户的访问需求,遵从“最后落地到数据库的请求数要尽量少”的原则。 1.消息队列解决削峰 要对流量进行削峰,最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直…

[HNCTF 2022] web 刷题记录

文章目录 [HNCTF 2022 Week1]easy_html[HNCTF 2022 Week1]easy_upload[HNCTF 2022 Week1]Interesting_http[HNCTF 2022 WEEK2]ez_SSTI[HNCTF 2022 WEEK2]ez_ssrf [HNCTF 2022 Week1]easy_html 打开题目提示cookie有线索 访问一下url 发现要求我们输入手机号,可是只…

又一关键系统上线,理想车云和自动驾驶系统登陆OceanBase

8 月 1 日,理想汽车公布 7 月交付数据,理想汽车 2023 年 7 月共交付新车 34,134 辆,同比增长 227.5%,并已连续两个月交付量突破三万。至此,理想汽车 2023 年累计交付量已经达到 173,251 辆,远超 2022 年全年…

【MATLAB第71期】基于MATLAB的Abcboost自适应决策树多输入单输出回归预测及多分类预测模型(更新中)

【MATLAB第71期】基于MATLAB的Abcboost自适应决策树多输入单输出回归预测及多分类预测模型(更新中) 一、效果展示(多分类预测) 二、效果展示(回归预测) 三、代码获取 CSDN后台私信回复“71期”即可获取下…

Python Opencv实践 - 凸包检测(ConvexHull)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/stars.png") plt.imshow(img[:,:,::-1])img_contour img.copy() #得到灰度图做Canny边缘检测 img_gray cv.cvtColor(img_contour, cv.COLOR_BGR2GRAY) edges…

NoSQL技术——Redis

简单介绍 Redis是当下最流行的NoSQL数据库。在Redis中,数据的存储格式是以键值对的方式进行存储的。在键值对的存储形式中,值除了是常见的字符串,也可以是类似于Json对象的形式,或者是List,Map等数组格式,…

vulnhub渗透测试靶场练习2

靶场介绍 靶场名:easy_cloudantivirus 靶场地址:https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453 环境搭建 依旧使用VM VirtualBox搭建靶场,攻击机使用的是VMware中的kali,需要将VMware虚拟机kali和virtualbox靶机…

CSS中如何实现元素的旋转和缩放效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素的旋转和缩放效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…

Ceph构件及组件分析

Ceph存储架构 Ceph 存储集群由几个不同的daemon组成,每个daemon负责Ceph 的一个独特功能并。每个守护进程是彼此独立的。 下面将简要介绍每个Ceph组件的功能: RADOS(Reliable Autonomic Distributed Object Store, RADOS) RADOS…

Win10搭建VisualSvn Server

Win10搭建VisualSvn Server 目录 Win10搭建VisualSvn Server一、下载VisualSvn Server安装包二、安装VisualSvn Server三、配置和使用VisualSVN Server四、添加用户及权限设定方法五、创建目录及配置权限 1、服务端:有集成了Subversion和Apache、安装使用非常简单且…

匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!

一、产品介绍 此次发布一款7寸高清全新外壳产品,让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动: 1 表面玻璃盖板使用2.5D立体结构; 2 液晶盖板采用一体黑设计,且液晶屏与触摸板是全贴合结构; …

什么是jvm

一、初识JVM(虚拟机) JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Jav…

Fedora Linux Flatpak 八月推荐应用

导读本文介绍了 Flathub 中可用的项目以及安装说明。 Flathub 是获取和分发适用于所有 Linux 的应用的地方。它由 Flatpak 提供支持,允许 Flathub 应用在几乎任何 Linux 发行版上运行。 请阅读 “Flatpak 入门”。要启用 Flathub 作为你的 Flatpak 提供商&#xff…