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

news2025/1/23 10:38:06

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

首先看到第一个议题

查询的执行与计划的缓存

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

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

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

执行如下:

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

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

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

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

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

Hint 提示

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

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

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

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

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

 

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

 

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

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

 执行计划如下:

 

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

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

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

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

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

相关文章

Leetcode 面试题 17.01 不用加号的加法

设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示: a, b 均可能是负数或 0结果不会溢出 32 位整数 我的答案: 一、信息 1.设计一个函数把两个数相加 2.不得使用或者其他运算符 3.a,b均为负数或…

代码随想录算法训练营第39天 | ● 62.不同路径 ● 63. 不同路径II

文章目录 前言一、62.不同路径二、63.不同路径II总结 前言 动态规划 一、62.不同路径 深搜动态规划数论 深搜: 注意题目中说机器人每次只能向下或者向右移动一步,那么其实机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点&#…

Socket交互的基本流程?

TCP socket通信过程图 什么是网络编程,网络编程就是编写程序使两台连联网的计算机相互交换数据。怎么交换数据呢?操作系统提供了“套接字”(socket)的组件我们基于这个组件进行网络通信开发。tcp套接字工作流程都以“打电话”来生…

Opencv快速入门教程,Python计算机视觉基础

快速入门 OpenCV 是 Intel 开源计算机视觉库。它由一系列 C 函数和少量 C 类构成, 实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个 C 函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也 可以使用某些外部库。 OpenCV 对非…

Java开发环境---jdk下载与安装,配置环境变量及如何验证是否安装成功

1、jdk说明与介绍 1、JDK即Java Develop Kit,是Java开发工具包 2、JDK的基本组件包括: javac:编译器,将源程序转成字节码。jar:打包工具,将相关类文件打包成一个文件。javadoc:文档生成器,从源码注释中提取文档。jdb…

PlumeLog【lite模式】部署使用

一 简述 本文档记录PlumeLog【lite模式】模式安装使用 启动模式 优点 缺点 Lite 模式 不依赖任何外部中间件直接启动使用,部署简单 性能有限,一天10G内可以应付,最好是SSD硬盘,适合管理系统类小玩家 Plumelog: 一个简单易用的java日志…

ROS机器人编程---------(一)安装ROS

安装ROS 打开终端按顺序执行下面命令 默认安装在/opt/ros路径下 打开一个终端输入roscore 测试是否安装成功 启动ROS Master roscore启动小海龟仿真器 rosrun turtlesim turtlesim_node启动海龟控制结点 rosrun turtlesim turtlesim_teleop_key使用键盘方向键控…

【李群李代数】Sophus库中SE3类测试(附manif 与sophus 对比)

测试演示 测试结果 对Sophus库中SE3类进行一系列的测试,包括李群性质、原始数据访问、变异访问器、构造函数以及拟合等方面。在每个测试中,都会使用一些预设的数据进行操作,并通过SOPHUS_TEST_APPROX和SOPHUS_TEST_EQUAL等宏来检查操作结果是…

2023应届生java面试搞笑之一:CAS口误说成开心锁-笑坏面试官

源于:XX网,如果冒犯,表示歉意 面试官:什么是CAS 我:这个简单,开心锁 面试官:WTF? 我:一脸自信,对,就是这个 面试官:哈哈大笑&#xff…

opencv入门-Opencv原理以及Opencv-Python安装

图像的表示 1,位数 计算机采用0/1编码的系统,数字图像也是0/1来记录信息,图像都是8位数图像,包含0~255灰度, 其中0代表最黑,1代表最白 3, 4,OpenCV部署方法 安装OpenCV之前…

AUTOSAR规范与ECU软件开发(实践篇)7.10MCAL模块配置方法及常用接口函数介绍之Base与Resource的配置

目录 1、前言 2 、Base与Resource模块 1、前言 本例程的硬件平台为MPC5744P开发板,主要配置MPC5744P的mcal的每个模块的配置,如要配置NXP的MCU之S32k324的例程请参考: 2 、Base与Resource模块 Base与Resource这两个模块与具体功能无关&…

什么是 Web 应用程序安全测试?

Web 应用程序安全测试是一种严格的实践,旨在识别、分析和纠正基于 Web 的应用程序中的漏洞。 此过程涉及使用一套全面的工具和方法来评估 Web 应用程序的安全性和完整性。它包括渗透测试、漏洞评估和代码审查等实践。 Web 应用程序安全测试的主要目标是阻止潜在的…

Linux 学习笔记(1)——系统基本配置与开关机命令

目录 0、起步 0-1)命令使用指引 0-2)查看历史的命令记录 0-3)清空窗口内容 0-4)获取本机的内网 IP 地址 0-5)获取本机的公网ip地址 0-6)在window的命令行窗口中远程连接linux 0-7)修改系…

[Linux]套接字通信

摘于https://subingwen.cn,作者:苏丙榅 侵删 文章目录 1. 套接字-socket1.1 概念1.2 网络协议1.3 socket编程1.3.1 字节序1.3.2 IP地址转换1.3.3 sockaddr 数据结构1.3.4 套接字函数 1.4 TCP通信流程1.4.1 服务器端通信流程1.4.2 客户端的通信流程 1.5 扩展阅读1.5.1 初始化套…

Cocos独立游戏开发框架中的日志模块:Bug无所遁形

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。 在Cocos独立游戏开发框架中,一个强大的日志模块是不可或缺的组成部分。日志不仅仅是记录应用程序的运行状态,还可以用于故障排除、性能监测和安全审计…

获取并修改图像中的像素点

实现原理 我们可以通过行和列的坐标值获取该像素点的像素值。对于BGR图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。使用相同的方法对像素值进行修改。 import numpy as np import cv2 as cv import matp…

Python语音识别处理详解

概要 人们对智能语音助手的需求不断提高,语音识别技术也随之迅速发展。在这篇文章中,我们将介绍如何使用Python的SpeechRecognition和pydub等库来实现语音识别和处理,从而打造属于自己的智能语音助手。 1. 什么是语音识别? 语音…

超图嵌入论文阅读1:对偶机制非均匀超网络嵌入

超图嵌入论文阅读1:对偶机制非均匀超网络嵌入 原文:Nonuniform Hyper-Network Embedding with Dual Mechanism ——TOIS(一区 CCF-A) 背景 超边:每条边可以连接不确定数量的顶点 我们关注超网络的两个属性&#xff1…

【Locomotor运动模块】瞬移

文章目录 一、原理二、两种类型1、Instant(立刻)2、Dash(猛冲) 三、瞬移区域、瞬移点1、瞬移区域2、瞬移点 一、原理 抛物线指针选择好目标位置,然后告诉瞬移预设体:你想法把游戏区域弄到目标位置来 解释:抛物线指针选…

阿里云对象存储oss-文件上传过程详解(两种方式)

阿里云对象存储oss-文件上传过程详解{两种方式} 方式一(最新代码,时间:2023/8/27)(1)如何配置系统变量(2)完整代码 方式二(跟黑马最新教程同代码)(1)在复制下来的代码中(2)完整代码 方式一(最新代码,时间:2023/8/27) 问题:需要配置系统变量才能够使用 (1)如何配置系统变量 以wi…