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

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

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.mzph.cn/diannao/46397.shtml

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

相关文章

Linux离线安装Mysql5.7

Linux之Mysql安装配置 第一种:Linux离线安装Mysql(提前手动下载好tar.gz包) 第二种:通过yum安装配置Mysql(服务器有网络) 之前在阿里云上采用yum安装过一次(请看这里),…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现

注:每个学校每个老师对论文的格式要求不一样,故本论文只供参考,本论文页数达到60页以上,字数在6000及以上。 基于SpringBootVueJS微信小程序技术的图书森林共享小程序设计与实现 目录 基于SpringBootVueJS微信小程序技术的图书森…

27.数码管的驱动,使用74HC595移位寄存器芯片

PS:升腾A7pro系列FPGA没有数码管外设,因此以AC620FPGA为例展开实验。 (1)共阳极数码管和共阴极数码管示意图: AC620中的数码管属于共阳极数码管,段选端口(dp,g,f,e,d,c,b,a)低电平即可点亮led。人眼的视觉…

连锁直营店小程序赋能多店如何管理

如商超便利店卖货线下场景,也有不少品牌以同城多店和多地开店经营为主,获取店铺周围客户和散流,如今线上重要性凸显,品牌电商发展是经营的重要方式之一,也是完善同城和外地客户随时便捷消费的方式之一。 多个门店管理…

抖音视频图文根据ID获得评论信息网站源码

抖音视频图文根据ID获得评论信息单页源码,id是视频的id,可以自定义第几条评论开始,不填默认为0,评论数量最大数量50,默认是20。 接口返回参数: "comments": 评论信息集合 { "uid": 评…

原创音乐小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,歌曲类型管理,歌曲信息管理,热门歌手管理,音乐资讯管理,系统管理 微信端账号功能包括:系统首页,歌曲信息&a…

数学建模·Topsis优劣解距离法

Topsis优劣解 一种新的评价方法,特点就是利用原有数据,客观性强。 相较于模糊评价和层次评价 更加客观,充分利用原有数据,精确反映方案差距 基本原理 离最优解最近,离最劣解越远 具体步骤 正向化 代码与原理与熵权…

链接追踪系列-08.mac m1安装logstash-番外

下载地址:https://elasticsearch.cn/download/ 配置es相关: #安装plugin: jelexbogon bin % ./logstash-plugin install logstash-codec-json_lines启动:指定配置文件运行 jelexbogon bin % nohup ./logstash -f ../config…

leetcode 513. 找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 < Node.val &…

张雪峰高考志愿填报

描述 张雪峰&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以自愿填报为主&#xff0c;对于学习自愿填报有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整…

vue3 快速入门 (一) : 环境配置与搭建

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 2. 安装Node.Js 首先&#xff0c;我们需要安装Node.Js。Node.js提供了运行 JavaScript 代码的环境。并且Node.js 带来了 npm&#xff0c;它是JavaScript世界的包管理工具。开发vue时&…

使用Copilot 高效开发繁忙的一天

在现代软件开发的世界里&#xff0c;使用AI工具如GitHub Copilot可以显著提高开发效率。 早晨&#xff1a;规划与启动 7:00 AM - 起床与准备 开发者早早起床&#xff0c;享用健康的早餐&#xff0c;并浏览新闻和技术博客&#xff0c;了解最新的科技动态。快速整理思路&#x…

MICS2024|少样本学习、多模态技术以及大语言模型在医学图像处理领域的研究进展|24-07-14

小罗碎碎念 本期推文主题 今天的会议很多主题都集中在大模型、多模态这两个方面&#xff0c;很明显&#xff0c;这两个方向都是目前的研究热点。 所以&#xff0c;我这一期推文会先简单的分析一下秦文健&#xff08;中科院&#xff09;和史淼晶&#xff08;同济大学&#xff09…

【STM32开发笔记】搭建VSCode+PyOCD的STM32开发环境

【STM32开发笔记】搭建VSCodePyOCD的STM32开发环境 一、安装软件1.1 安装STM32CubeMX1.2 安装VSCode1.3 安装Arm GNU Toolchain1.4 安装Make for Windows1.5 安装Python1.6 安装PyOCD 二、安装插件2.1 VSCode插件2.2 PyOCD支持包 三、创建项目3.1 创建STM32CubeMX项目3.2 查阅原…

口袋算法的示例

原理 口袋算法是感知器(Perceptron)算法的一种改进。感知器算法是一种线性分类算法,但在训练数据不是线性可分的情况下,它可能无法收敛,即无法找到一个线性分类器来正确分类所有的训练样本。为了解决这个问题,口袋算法引入了一个"口袋"(Pocket),用来存储迄…

【Java】字符与字符串

文章目录 1.字符char1.1 编码1.2 转义字符1.3 char的类型转换1.4 字符的比较1.5 Character类 2.String类型2.1 String对象常用的方法&#xff1a;2.2 从控制台读取字符串2.3 从控制台读取字符2.4 字符串的比较2.5 子串和字符2.6 字符串的转化2.7 格式化控制台输出 1.字符char …

IOT 可编程控制系统

IOT&#xff08;物联网&#xff09;可编程控制系统&#xff0c;如GF-MAXCC等&#xff0c;是一种集成了多种先进技术和功能的智能化控制设备&#xff0c;它能够在物联网系统中发挥关键作用&#xff0c;实现对多种设备的集中管理和控制。具体来说&#xff0c;IOT可编程控制系统的…

【算法专题】双指针算法之 1089.复写零(力扣)

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之 1089.复写零&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算…

2024版彩虹晴天全能知识付费源码+虚拟商城解决方案 含一键搭建视频教程 无授权限制

是一款知识付费平台的核心&#xff0c;更是集虚拟商城、实物交易、代理分销于一体的全能解决方案。 核心亮点&#xff1a; 最新源码&#xff0c;独家首发&#xff1a;经过精心修复与更新&#xff0c;本源码由我们团队亲自把关&#xff0c;确保您获得的是市场上最新鲜、最稳定…

DBA 数据库管理 表管理 数据批量处理。表头约束

表管理 建库 库名命名规则&#xff1a;仅可以使用数字、字母、下划线、不能纯数字 不可使用MySQL命令或特殊字符 库名区分字母大小写 加if not exists 命令避免重名报错 create database if not exists gamedb; 建表 drop database if exists gamedb ; 删表…