SqlServer SQL语句或存储过程运行慢 使用 WITH RECOMP ILE 或 OPTION (RECOMPILE)(重新编译)

news2024/9/23 13:28:24

如果您的存储过程包含参数可以重新申明变量把参数接收下,可能解决你过程执行慢的原因。如果未能解决,请参考以下文章内容:

WITH RECOMPILE 子句可以在以下地方使用:

一种是当你创建一个过程时,例如:

CREATE PROCEDURE MySP WITH RECOMPILE AS
这指示 SQL Server 在每次调用时重新编译整个过程,并且从不缓存该计划。

另一种情况是当你调用一个过程时:

EXEC MySP WITH RECOMPILE
这告诉 SQL Server 重新编译此调用的过程,绕过缓存中的内容。我不知道新计划是否存储在缓存中,或者是否被丢弃。

这两个都是至少从 SQL Server 4.x 开始就存在于产品中的旧功能。

从SQL 2005开始,有一个更好的选择,那就是语句级提示OPTION(RECOMPILE):

SELECT ...
FROM   tbl
WHERE Id = @id OR @id NULL
OPTION (RECOMPILE)
        这告诉 SQL Server 每次执行此语句时都重新编译它。这比 WITH RECOMPILE 更强大,原因有二。一是如果这是过程中唯一一个每次都需要重新编译的语句,则通过不重新编译其余部分可以节省资源。但真正强大的是 @id 可以作为常量处理,因此当您有 @id 时可以进行索引查找,而当您没有 @id 时可以进行表扫描。使用 WITH RECOMPILE 无法获得这种效果,因为编译发生在过程启动时,并且 @id 的运行时值未知。

        因此,WITH RECOMPILE 和 CREATE PROCEDURE 实际上是一个已停用的功能,您很少(如果有的话)有理由使用它。我认为 EXEC WITH RECOMPILE 从未被广泛使用过。

选项(重新编译):
首先,让我们创建一个包含关键字OPTION(RECOMPILE)的存储过程。

CREATE OR ALTER PROC GetCustomerOrders (@CustomerID INT)
AS
SELECT *
FROM WideWorldImporters.Sales.Orders
WHERE CustomerID = @CustomerID
OPTION (RECOMPILE)

现在在 SQL Server Management Studio (SSMS) 中为查询窗口启用执行计划。

接下来,让我们使用两个不同的参数运行以下两个存储过程。

EXEC GetCustomerOrders 1060
EXEC GetCustomerOrders 90
GO

        当我们看到查询的执行计划时,您会注意到,这次执行计划对行有一个正确的估计,因此查询正在消耗优化特定执行计划所需的资源。

        当查询需要更多资源时,它会占用更多资源,当需要更少资源时,它会使用适当的资源。这是一个很大的调整,SQL Server 每次执行存储过程时都会进行调整。 


参考:SQL SERVER - Parameter Sniffing and OPTION (RECOMPILE) - SQL Authority with Pinal Dave

Queries with OPTION (RECOMPILE) and Query Store - Erin Stellato

使用 Transact-SQLUsing Transact-SQL:

1、连接到数据库引擎。

2、从标准栏中选择“新建查询”。

3、将以下示例复制并粘贴到查询窗口中,然后选择“执行”。此示例创建过程定义。

USE AdventureWorks2022;  
GO  
IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL   
    DROP PROCEDURE dbo.uspProductByVendor;  
GO  
CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = '%'  
WITH RECOMPILE  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'  
    FROM Purchasing.Vendor AS v   
    JOIN Purchasing.ProductVendor AS pv   
      ON v.BusinessEntityID = pv.BusinessEntityID   
    JOIN Production.Product AS p   
      ON pv.ProductID = p.ProductID  
    WHERE v.Name LIKE @Name;  
    
使用 WITH RECOMPILE 选项重新编译存储过程
选择“新建查询”,然后将以下代码示例复制并粘贴到查询窗口中,然后选择“执行”。这将执行该过程并重新编译该过程的查询计划。

USE AdventureWorks2022;  
GO  
EXECUTE HumanResources.uspProductByVendor WITH RECOMPILE;  
GO

使用 sp_recompile 重新编译存储过程
选择“新建查询”,然后将以下示例复制并粘贴到查询窗口中,然后选择“执行”。这不会执行该过程,但它会标记要重新编译的过程,以便在下次执行该过程时更新其查询计划。

USE AdventureWorks2022;  
GO  
EXEC sp_recompile N'dbo.uspProductByVendor';   
GO 

参考:Recompile a Stored Procedure - SQL Server | Microsoft Learn 

OPTION(RECOMPILE)总是更快;为什么?

        有时使用OPTION(RECOMPILE)是有意义的。根据我的经验,唯一可行的选择是使用动态 SQL。在探索这是否适合您的情况之前,我建议您重建统计信息。这可以通过运行以下命令来完成:

EXEC sp_updatestats
然后重新创建执行计划。这将确保在创建执行计划时将使用最新信息。

OPTION(RECOMPILE)每次执行查询时都会重新构建执行计划。我从未听说过这样的描述,但creates a new lookup strategy也许我们只是对同一件事使用了不同的术语。

        创建存储过程时(我怀疑您正在从 .NET 调用临时 SQL,但如果您使用参数化查询,那么这最终将成为存储过程调用)SQL Server 尝试根据数据库中的数据和传入的参数确定此查询的最有效执行计划(参数嗅探),然后缓存该计划。这意味着,如果您在数据库中有 10 条记录的情况下创建查询,然后在有 100,000,000 条记录时执行该查询,则缓存的执行计划可能不再是最有效的。

        总结一下 - 我看不出有任何理由OPTION(RECOMPILE)会在这里带来好处。我怀疑你只需要更新你的统计数据和执行计划。重建统计数据可能是 DBA 工作的一个重要部分,具体取决于你的情况。如果在更新统计数据后仍然遇到问题,我建议发布两个执行计划。

        OPTION (RECOMPILE)为什么更快,我想说,每次执行查询时重新编译执行计划的最佳选择是非常不寻常的。

参考:sql - OPTION (RECOMPILE) is Always Faster; Why? - Stack Overflow 

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

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

相关文章

海事无人机解决方案

海事巡察 海事巡察现状 巡查效率低下,存在视野盲区,耗时长,人力成本高。 海事的职能 统一管理水上交通安全和防治船舶污染。 管理通航秩序、通航环境。负责水域的划定和监督管理,维护水 上交通秩序;核定船舶靠泊安…

顺序表算法 - 移除元素

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-element/description/思路: 代码: // numsSize表示数组的长度 …

子数组问题

目录 最大子数组和 环形子数组的最大和 乘积最大子数组 乘数为正数的最长子数组长度 等差数列划分 最长湍流子数组 单词拆分 环绕字符串中唯一的子字符串 声明:接下来主要使用动态规划来解决问题!!! 最大子数组和 题目 …

数据结构进阶——使用数组实现栈和队列详解与示例(C,C#,C++)

文章目录 1、数组实现栈栈的基本操作C语言实现C#语言实现 2、 数组实现队列队列的基本操作C语言实现C# 语言实现C语言实现 总结 在编程世界中,数据结构是构建高效算法的基石。栈和队列作为两种基本的数据结构,它们的应用非常广泛。本文将带领大家使用C&a…

【OrangePi AIpro】: 探索AI加成的开源硬件魅力

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Orange Pi: 探索开源硬件的魅力引言Orange Pi概述OrangePi AIPro产品介绍试用体…

STM32第二十课:FreeRTOS任务管理和信号量

目录 一、任务管理方式二、任务堆栈溢出检测三、二值信号量(任务同步)四、计数信号量五、互斥信号量六、队列 一、任务管理方式 1.任务创建成功后会添加到就绪链表中,开启调度器,此时任务调度器会去就绪链表中找优先级最高的任务执…

数据增强新方法SUMix:解决Mixup混合后的图像的内容与其标签不匹配问题

数据增强新方法SUMix:解决Mixup混合后的图像的内容与其标签不匹配问题 提出背景当前混合方法的问题MixUp 操作标签混合混合交叉熵(MCE)混合交叉熵(MCE)的核心作用混合交叉熵(MCE)的功能 CutMix原…

$accumulator(聚合)

$accumulator 是 MongoDB 聚合管道中用于自定义数据处理逻辑的一个算子,它允许用户使用 JavaScript 编写代码来控制数据的初始化、累积、合并和最终输出。下面是对 $accumulator 各个部分的详细解释: init: 这是一个 JavaScript 函数,用于初…

数据结构回顾(Java)

1.数组 线性表 定义的方式 int[] anew int[10] 为什么查询快? 1.可以借助O(1)时间复杂度访问某一元素, 2.地址连续,逻辑连续 3.数组长度一旦确定就不可以被修改 当需要扩容的时候需要将老数组的内容复制过来 在Java中数组是一个对象 Ar…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据,我们生成了多种图表,包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

国内体外诊断行业翘楚『迈克生物』SRM项目启动,企企通赋能IVD产业打造高效采购供应链体系

IVD行业(体外诊断行业)在医疗领域被誉为“医生的眼睛”,是现代检验医学的重要构成部分,在临床应用中贯穿了疾病预防、初步诊断、治疗方案选择、疗效评价等疾病治疗的全过程,在现代医学疾病诊断中发挥着重要作用。 随着…

springboot1——快速构建项目

需求 第一步:创建maven工程(非web项目) 第二步:导入起步依赖 点击: 下拉复制: 粘贴:!!这是springboot工程需要继承的父工程 下拉复制: 粘贴:!&#xf…

JAVA:常用的链表指南

请关注微信公众号:拾荒的小海螺 博客地址:http://lsk-ww.cn/ 1、简述 链表是一种常见的数据结构,它通过一系列节点(Node)来表示一个序列。每个节点包含数据和指向下一个节点的引用。链表的种类有很多,包括…

网络文件系统—NFS

目录 一、概述 二、NFS挂载原理 三、NFS相关协议及软件安装管理 1.协议: 2.软件: 四、NFS系统守护进程 五、NFS服务器的配置 六、NFS服务器的启动与停止 1. 启动NFS服务器 2.查询NFS服务器状态 3.停止NFS服务器 4.设置NFS服务器的自动启动状…

games103作业2(未完)

PBD方法 首先是每个质点的力的分析,不考虑碰撞和弹簧弹力的情况下,每个质点受重力的影响,所以需要对每个质点进行速度和位置的重力影响更新。 float t 0.0333f; float damping 0.99f; int[] E; float[] L; Vector3[] V; Vector3 gra…

【数学建模】——数学规划模型

目录 一、线性规划(Linear Programming) 1.1 线性规划的基本概念 1.2 线性规划的图解法 模型建立: 二、整数规划(Integer Programming) 2.1 整数规划的基本概念 2.2 整数规划的求解方法 三、非线性规划&#x…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2139张 标注数量(xml文件个数):2139 标注数量(txt文件个数):2139 标注类别数:8 标注类别名称:[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

220V降压5ⅤIC-AH8652

220V降压至5V的IC - AH8652 在电子设计中,电压转换是一个常见的需求,尤其是在需要将高电压转换为低电压以供电给微电子设备时。AH8652是一款专为降压转换设计的集成电路,它能够将220V的交流输入电压转换为稳定的5V直流输出,非常适…

Camunda如何通过外部任务与其他系统自动交互

文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表: Camunda组件与服务与…

spring6之容器:IOC

容器:IOC 控制反转(Ioc) IoC容器在Spring的实现 Spring 的 IoC 容器就是 IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建IoC 容器。Spring 提供了IoC 容器的两种实现方式&#xf…