SQL Server 使用 OPTION (RECOMPILE) 和查询存储的查询

news2024/11/23 15:10:56

设置
        我们正在使用 WideWorldImporters 数据库,您可以从 Github 下载【sql-server-samples/samples/databases/wide-world-importers at master · microsoft/sql-server-samples · GitHub】。我正在运行SQL Server 2017 的最新 CU【https://sqlserverbuilds.blogspot.com/】,但这适用于任何版本的查询存储(SQL Server 2016 及更高版本)和 Azure SQL 数据库。下面的代码将启用查询存储,将 QUERY_CAPTURE_MODE 设置为 ALL(要了解各种不同以及建议用于生产的内容,请查看我的查询存储设置帖子【https://blog.csdn.net/hefeng_aspnet/article/details/140130527】),然后清除查询存储中的所有内容。我通常不建议您清除查询存储,但我们正在恢复演示数据库,这是一个演示,所以我要确保我们从头开始。最后,我们将创建一个用于测试的存储过程,该存储过程使用 RECOMPILE 创建,然后完全释放过程缓存。请注意,我不建议向存储过程添加 RECOMPILE 选项 - 这意味着每次执行时都会重新编译整个存储过程。我也不建议在生产中释放过程缓存 - 这只是为了演示目的。
USE [master];
GO
ALTER DATABASE [WideWorldImporters] SET QUERY_STORE = ON;
GO
ALTER DATABASE [WideWorldImporters] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, QUERY_CAPTURE_MODE = ALL);
GO
ALTER DATABASE [WideWorldImporters] SET QUERY_STORE CLEAR;
GO
 
DROP PROCEDURE IF EXISTS Sales.usp_GetOrderInfo 
GO
 
CREATE PROCEDURE Sales.usp_GetOrderInfo
(@OrderID INT)
WITH RECOMPILE
AS
BEGIN
SELECT
o.OrderID,
o.CustomerID,
o.OrderDate,
ol.Quantity,
ol.UnitPrice
FROM Sales.Orders o
JOIN Sales.OrderLines ol
ON o.OrderID = ol.OrderID
WHERE o.OrderID = @OrderID;
END
GO
 
DBCC FREEPROCCACHE;
GO

测试
        首先,执行一个临时查询(不属于存储过程的一部分,具有 OPTION (RECOMIPLE) 提示):

SELECT
i.InvoiceID,
i.CustomerID,
i.InvoiceDate,
il.Quantity,
il.UnitPrice
FROM Sales.Invoices i
JOIN Sales.InvoiceLines il
ON i.InvoiceID = il.InvoiceID
WHERE i.InvoiceID = 54983
OPTION (RECOMPILE);
GO 10

如果我们检查计划缓存,您会注意到没有证据表明该查询已执行:

SELECT
qs.execution_count,
st.text, 
qs.creation_time
FROM sys.dm_exec_query_stats AS [qs] 
CROSS APPLY sys.dm_exec_sql_text ([sql_handle]) [st]
CROSS APPLY sys.dm_exec_query_plan ([plan_handle]) [p]
WHERE [st].[text][/text] LIKE '%Sales.Invoices%';
GO

但如果我们查看查询存储,我们确实会看到以下查询:
SELECT
[qsq].[query_id], 
[qsp].[plan_id],
[qsq].[object_id],
[rs].[count_executions],
[rs].[last_execution_time],
[rs].[avg_duration],
[rs].[avg_logical_io_reads],
[qst].[query_sql_text],
TRY_CONVERT(XML, [qsp].[query_plan]) AS [QueryPlan_XML],
[qsp].[query_plan] 
FROM [sys].[query_store_query] [qsq] 
JOIN [sys].[query_store_query_text] [qst]
ON [qsq].[query_text_id] = [qst].[query_text_id]
JOIN [sys].[query_store_plan] [qsp] 
ON [qsq].[query_id] = [qsp].[query_id]
JOIN [sys].[query_store_runtime_stats] [rs] 
ON [qsp].[plan_id] = [rs].[plan_id]
WHERE [qst].[query_sql_text] LIKE '%Sales.Invoices%';
GO 

如果我们展开 query_sql_text 列(由于空间原因删除了中间的文本),你会看到文本包含OPTION (RECOMPILE)。这很酷。

现在让我们执行使用 RECOMPILE 创建的存储过程,然后检查计划缓存:

EXEC Sales.usp_GetOrderInfo 57302;
GO 10
 
SELECT
qs.execution_count,
st.text, 
qs.creation_time
FROM sys.dm_exec_query_stats AS [qs] 
CROSS APPLY sys.dm_exec_sql_text ([sql_handle]) [st]
CROSS APPLY sys.dm_exec_query_plan ([plan_handle]) [p]
WHERE [st].[text][/text] LIKE '%Sales.Orders%';
GO

当我们检查查询存储时,我们确实看到了查询: 

SELECT
[qsq].[query_id], 
[qsp].[plan_id],
[qsq].[object_id],
OBJECT_NAME([qsq].[object_id]) AS ObjectName,
[rs].[count_executions],
[rs].[last_execution_time],
[rs].[avg_duration],
[rs].[avg_logical_io_reads],
[qst].[query_sql_text],
TRY_CONVERT(XML, [qsp].[query_plan]) AS [QueryPlan_XML],
[qsp].[query_plan] /* nvarchar(max) */
FROM [sys].[query_store_query] [qsq] 
JOIN [sys].[query_store_query_text] [qst]
ON [qsq].[query_text_id] = [qst].[query_text_id]
JOIN [sys].[query_store_plan] [qsp] 
ON [qsq].[query_id] = [qsp].[query_id]
JOIN [sys].[query_store_runtime_stats] [rs] 
ON [qsp].[plan_id] = [rs].[plan_id]
WHERE OBJECT_NAME([qsq].[object_id]) = 'usp_GetOrderInfo';
GO

概括
        无论在何处使用 OPTION(RECOMPILE)——在临时查询的语句级别还是在存储过程内的语句——以及在创建或执行期间在过程级别使用 RECOMPILE 选项时——查询文本、计划和执行统计信息仍会在查询存储中捕获。

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

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

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

相关文章

Adobe国际认证详解-网页设计认证专家行业应用场景解析

在当今数字化时代,网页设计已成为各行各业不可或缺的一环。而网页设计认证专家,作为经过Adobe国际认证体系严格考核的专业人才,正逐渐成为行业内炙手可热的存在。他们凭借深厚的网页设计理论基础和实践经验,为各行各业提供了高质量…

建筑工程企业项目管理系统哪个好?试试企智汇工程项目管理系统

在建筑工程行业中,项目管理的复杂性和挑战性是众所周知的。随着项目规模的扩大和技术的不断进步,传统的管理方法已经难以满足现代建筑工程的需求。企智汇工程项目管理系统应运而生,为建筑工程企业提供了一个全面、智能、高效的解决方案。 一…

“生日悖论”简析——公式计算、代码模拟

“生日悖论”共享生日概率,通项公式计算,代码模拟计算。 (笔记模板由python脚本于2024年07月17日 18:16:40创建,本篇笔记适合会基础编程的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&…

Flutter Dart Macro 宏简化 JSON 序列化

Flutter Dart Macro 宏简化 JSON 序列化 视频 https://youtu.be/gBZYjBmoOcU https://www.bilibili.com/video/BV1tT421a7ev/ 前言 原文 https://ducafecat.com/blog/using-dart-macros-to-simplify-json-serialization 今天我们将会体验 dart 语言新特性 macro 宏&#xff…

Vue3中实现自然滚动表格列表,可调整滚动快慢

实现效果如图所示,可以调整滚动的快慢,可以实现内容高度不够的时候停止滚动的效果。 1.实现原理: 创建一个dom为ul,赋值为当前列表数据,然后拷贝这个dom赋值给第二个ul,然后判断屏幕高度跟滚动高度对比&a…

第三届智能机械与人机交互技术学术会议(IHCIT 2024)

【北航主办丨本届SPIE独立出版丨已确认ISSN号】 第三届智能机械与人机交互技术学术会议(IHCIT 2024) 2024 3rd International Conference on Intelligent Mechanical and Human-Computer Interaction Technology 2024年7月27日----中国杭州&#xff0…

Redis深度解析:从基础到高级特性,剖析关键技术

一、关于Redis Redis介绍 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSIC 语言编写、遵守 BSD(开源协议) 协议、支持网络、可基于内存…

Linux云计算 |【第一阶段】ENGINEER-DAY5

主要内容: SELinux、系统故障修复、HTTPD/FTP服务搭建、防火墙策略管理、服务管理 一、SELinux安全制度 SELinux(Security-Enhanced Linux),美国NSA国家安全局主导开发,一套增强Linux系统安全的强制访问控制体系&…

6. dolphinscheduler-3.0.0伪集群部署

环境说明: 主机名:cmc01为例 操作系统:centos7 安装部署软件版本部署方式centos7zookeeperzookeeper-3.4.10伪分布式hadoophadoop-3.1.3伪分布式hivehive-3.1.3-bin伪分布式clickhouse21.11.10.1-2单节点多实例dolphinscheduler3.0.0单节…

【JavaScript 算法】拓扑排序:有向无环图的应用

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现方法一:Kahn算法方法二:深度优先搜索(DFS)注释说明: 三、应用场景四、总结 拓扑排序(Topological Sorting)是一种…

测试数据科学家深度学习基础知识的 45 个问题(以及解决方案)

测试数据科学家深度学习基础知识的 45 个问题(以及解决方案) 一、介绍 早在2009年, 深度学习还只是一个新兴领域。只有少数人认为这是一个富有成效的研究领域。今天,它被用于开发应用程序,这些应用程序在一段时间前被认为是困难或不可能做到的。 语音识别、图像识别、在数…

<Qt> 初识Qt

目录 一、项目文件解析 widget.h main.cpp widget.cpp widget.ui .pro文件 二、QT 实现Hello World程序 (一)按钮控件 1. 纯代码 2. 图形化 (二)标签控件 1. 纯代码 2. 图形化 三、内存泄漏问题 四、qdebug()的使用…

MySQL(事务、索引)MyBatis

目录 事务 概述 四大特性(ACID) 索引 结构 语法 MyBatis 数据库连接池 lombok 基本操作--增删改查 根据主键删除 新增 更新 查询(根据ID查询) 查询(条件查询) XML映射文件 动态SQL 动态条…

Web安全:未验证的重定向和转发.

Web安全:未验证的重定向和转发. 未验证的重定向和转发漏洞是一种常见的Web安全漏洞,它允许攻击者将用户重定向到一个恶意的URL,而不是预期的安全URL。这种漏洞通常发生在应用程序处理重定向和转发请求时,未能对目标URL进行适当的…

RDMA 高性能架构基本原理与设计方案

在进行本文的学习学习之前,我们先对RDMA是什么做一个简单的科普与认识:一文带你了解什么是RDMA-CSDN博客 目录: 目录: 一、RDMA和传统网络方案的比较 1.1 传统网络方案: 1.1.1 缺点一:以太网卡&#xff0…

单机、集群、分布式服务器比较:

1. 单机服务器的瓶颈: 单机服务器:一台服务器独立运行一个工程所需的全部的业务模块 受限于服务器硬件资源,所承受用户并发量受限,32位linux操作系统最大并发量为两万任一模块的变动和修改,都会导致整个项目代码重新编…

移动端如何离线使用GPT

在移动端离线使用GPT,只需要一个app:H2O AI Personal GPT 是H2OAI上架的一款app,可离线使用,注重数据隐私,所有数据都只存储在本地。对H2OAI感兴趣的伙伴,可移步:https://h2o.ai 该app支持的模…

华为od 100问 持续分享6-入职体检

我是一名软件开发培训机构老师,我的学生已经有上百人通过了华为OD机试,学生们每次考完试,会把题目拿出来一起交流分享。 重要:2024年5月份开始,考的都是OD统一考试(D卷),题库已经整…

如何学习Kafka:糙快猛的大数据之路(快速入门到实践)

在大数据开发的世界里,Kafka 无疑是一个不可或缺的重要角色。作为一个分布式流处理平台,它以其高吞吐量、可靠性和可扩展性而闻名。 目录 糙快猛学习法则Kafka 是什么?我的 Kafka 学习故事第一步: 快速上手第二步: 生产和消费消息第三步: 编写简单的生产者和消费者程序 深入Ka…

达梦数据库 DISQL连接数据库与执行SQL、脚本的方法

DISQL连接数据库与执行SQL、脚本的方法 1.DISQL介绍2.DISQL连接数据库的方法2.1 本地连接2.2 远程连接2.3 CONN连接 3.执行SQL、脚本的方法3.1 通过DISQL登录后在字符界面3.2 启动DISQL时运行脚本3.3 进入DISQL后,通过start命令运行脚本3.4 使用EDIT命令编辑脚本 1.…