当前位置: 首页 > article >正文

SQL Server查询性能下降:执行计划不稳定与索引优化

问题现象
SQL Server 2022 中某些关键查询性能突然下降,执行时间从毫秒级增至数秒,日志中未报错,但查询计划显示低效的索引扫描或键查找。


快速诊断
  1. 捕获实际执行计划

    -- 启用实际执行计划
    SET STATISTICS XML, TIME ON;
    SELECT * FROM Sales.Orders WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31';
    SET STATISTICS XML, TIME OFF;
    • 关键指标

      • 索引扫描(Index Scan)占比高

      • 预估行数与实际行数差异大

  2. 检查索引碎片与统计信息

    -- 查看索引碎片率
    SELECT OBJECT_NAME(ips.object_id) AS TableName,si.name AS IndexName,ips.avg_fragmentation_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
    JOIN sys.indexes si ON ips.object_id = si.object_id AND ips.index_id = si.index_id
    WHERE ips.avg_fragmentation_in_percent > 30;-- 检查统计信息最后更新时间
    SELECT OBJECT_NAME(s.object_id) AS TableName,s.name AS StatsName,STATS_DATE(s.object_id, s.stats_id) AS LastUpdated
    FROM sys.stats s
    WHERE OBJECT_NAME(s.object_id) = 'Orders';

  3. 分析查询存储(Query Store)

    -- 查找性能退化的查询
    SELECT qsq.query_id,qsq.query_text_id,qsqt.query_sql_text,qsrs.avg_duration
    FROM sys.query_store_query qsq
    JOIN sys.query_store_query_text qsqt ON qsq.query_text_id = qsqt.query_text_id
    JOIN sys.query_store_plan qsp ON qsq.query_id = qsp.query_id
    JOIN sys.query_store_runtime_stats qsrs ON qsp.plan_id = qsrs.plan_id
    WHERE qsrs.avg_duration > 1000  -- 设定阈值(毫秒)
    ORDER BY qsrs.avg_duration DESC;

解决方案
步骤 1:优化索引策略
  1. 重建/重组索引

    -- 重建碎片率超过30%的索引
    ALTER INDEX IX_Orders_OrderDate ON Sales.Orders REBUILD;
    -- 重组碎片率5%-30%的索引
    ALTER INDEX IX_Orders_CustomerID ON Sales.Orders REORGANIZE;
  2. 创建缺失索引(基于执行计划建议):

    CREATE NONCLUSTERED INDEX IX_Orders_OrderDate_CustomerID
    ON Sales.Orders (OrderDate)
    INCLUDE (CustomerID, TotalAmount);
  3. 启用列存储索引(适用于分析查询):

    CREATE NONCLUSTERED COLUMNSTORE INDEX CSI_Orders
    ON Sales.Orders (OrderDate, CustomerID, TotalAmount);
步骤 2:更新统计信息
-- 更新表的统计信息(全扫描)
UPDATE STATISTICS Sales.Orders WITH FULLSCAN;
-- 自动启用异步统计更新
ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS_ASYNC ON;
步骤 3:强制稳定执行计划
  1. 使用查询存储固定计划

    -- 查找高效的历史计划ID
    SELECT plan_id, query_id, is_forced_plan
    FROM sys.query_store_plan
    WHERE query_id = 123;  -- 替换为实际查询ID-- 强制使用特定计划
    EXEC sp_query_store_force_plan @query_id = 123, @plan_id = 456;
  2. 参数敏感计划优化(SQL Server 2022 新特性)

    -- 启用参数敏感化
    ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;

验证与监控
  1. 对比优化前后性能

    -- 使用查询存储对比执行时间
    SELECT qsp.plan_id,qsrs.avg_duration,qsrs.avg_cpu_time
    FROM sys.query_store_plan qsp
    JOIN sys.query_store_runtime_stats qsrs ON qsp.plan_id = qsrs.plan_id
    WHERE qsp.query_id = 123;
  2. 启用实时监控工具

    • 扩展事件(Extended Events)

      CREATE EVENT SESSION QueryPerformanceMonitoring
      ON SERVER
      ADD EVENT sqlserver.sql_statement_completed(ACTION (sqlserver.sql_text, sqlserver.plan_handle)WHERE sqlserver.database_id = DB_ID('MyDB'))
      ADD TARGET package0.event_file(SET filename = N'C:\Logs\QueryPerformance.xel');

扩展场景:高并发下的锁竞争
  • 问题示例Deadlock encountered, victim process killed

  • 解决方案

    1. 优化事务隔离级别

      SET TRANSACTION ISOLATION LEVEL READ COMMITTED SNAPSHOT;
    2. 使用锁提示减少阻塞

      SELECT * FROM Sales.Orders WITH (NOLOCK) WHERE OrderID = 1001;
    3. 死锁分析

      SELECT deadlock_xml.value('(//victim-process/inputbuf/text())[1]', 'VARCHAR(MAX)') AS VictimQuery,deadlock_xml.value('(//process/inputbuf/text())[1]', 'VARCHAR(MAX)') AS BlockingQuery
      FROM sys.fn_xe_file_target_read_file('C:\Logs\system_health*.xel', NULL, NULL, NULL)
      WHERE OBJECT_NAME = 'xml_deadlock_report';

安全与自动化建议
  1. 定期索引维护

    # 使用 PowerShell 脚本每周自动重建索引
    Invoke-SqlCmd -Query "EXEC dbo.usp_RebuildFragmentedIndexes @FragmentationThreshold = 30;"
  2. 配置资源调控器(Resource Governor)

    -- 创建资源池限制 CPU 使用
    CREATE RESOURCE POOL HighPriorityPool WITH (MAX_CPU_PERCENT = 50);
    CREATE WORKLOAD GROUP CriticalQueries USING HighPriorityPool;

通过以上步骤,可系统性解决查询性能下降问题。若涉及复杂查询,建议使用 执行计划分析工具(如 SentryOne Plan Explorer)深入解析操作符成本。生产环境中应启用基线监控,结合 Azure Monitor 或第三方工具(如 SolarWinds)实现实时告警。

相关文章:

SQL Server查询性能下降:执行计划不稳定与索引优化

问题现象: SQL Server 2022 中某些关键查询性能突然下降,执行时间从毫秒级增至数秒,日志中未报错,但查询计划显示低效的索引扫描或键查找。 快速诊断 捕获实际执行计划: -- 启用实际执行计划 SET STATISTICS XML, TIME…...

【学Rust写CAD】31 muldiv255函数(muldiv255.rs,已经取消)

源码 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…...

`uia.WindowControl` 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式

uia.WindowControl 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系统的 UI 自动化框架(如 pywinauto 中的 uia 模块)里用于表示窗口控件的类。在 Windows 操作系统中,每个应用程序的窗口都可以看作是一个控件,ui…...

vue3 处理文字 根据文字单独添加class

下面写的是根据后端返回的html 提取我需要的标签和字 将他们单独添加样式 后端返回的数据 大概类似于<h1>2024年“双11”购物节网络零售监测报告</h1><p>表1 “双11” 期间网络零售热销品类TOP10</p> function checkfun(newList){if (newList) {let …...

Python爬虫教程011:scrapy爬取当当网数据开启多条管道下载及下载多页数据

文章目录 3.6.4 开启多条管道下载3.6.5 下载多页数据3.6.6 完整项目下载3.6.4 开启多条管道下载 在pipelines.py中新建管道类(用来下载图书封面图片): # 多条管道开启 # 要在settings.py中开启管道 class DangdangDownloadPipeline:def process_item(self, item, spider):…...

Jupyter Notebook不能自动打开默认浏览器怎么办?

在安装anaconda的过程中,部分用户可能会遇到,打开Jupyter Notebook的时候,不会弹出默认浏览器。本章教程给出解决办法。 一、生成一个jupyter默认配置文件 打开cmd,运行以下命令,会生成一个jupyter_notebook配置文件。 jupyter notebook --generate-config二、编辑jupyter_…...

VUE中数据绑定之OptionAPI

<template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…...

Spring Boot 工程创建详解

2025/4/2 向全栈工程师迈进&#xff01; 一、SpingBoot工程文件的创建 点击Project Structure 然后按着如下点击 最后选择Spring Boot &#xff0c;同时记得选择是Maven和jar&#xff0c;而不是war。因为Boot工程内置了Tomcat&#xff0c;所以不需要war。 紧接着选择Spring We…...

Spring Boot + MyBatis + Maven论坛内容管理系统源码

项目描述 xxxForum是一个基于Spring Boot MyBatis Maven开发的一个论坛内容管理系统&#xff0c;主要实现了的功能有&#xff1a; 前台页面展示数据、广告展示内容模块&#xff1a;发帖、评论、帖子分类、分页、回帖统计、访问统计、表单验证用户模块&#xff1a;权限、资料…...

国网B接口协议资源上报流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议资源上报接口介绍B.2.1 接口描述B.2.2 接口流程B.2.3 接口参数B.2.3.1 SIP头字段B.2.3.2 SIP响应码B.2.3.3 XML Schema参数定义 B.2.4 消息示例B.2.4.1 上报前端系统的资源B.2.4.2 响应消息 二、B接口资源上报失败常见问题&#xff08;一&#xff09;证书…...

布谷一对一直播源码android版环境配置流程及功能明细

一&#xff1a;举例布谷交友&#xff08;一对一直播源码&#xff09;搭建部署的基本环境说明 1. 首先安装Center OS 7.9系统&#xff0c;硬盘最低 40G 2. 安装宝塔环境 https://bt.cn&#xff08;强烈推荐使用&#xff09; 3. 安装环境 ● PHP 7.3&#xff08;安装redis扩展…...

TypeScript 类型系统详解

基础类型​ TypeScript 支持丰富的基础数据类型&#xff0c;涵盖number、string、boolean、null、undefined、symbol以及bigint。这些类型为构建可靠的代码提供了基石。​ 数值类型&#xff08;number&#xff09;&#xff1a;在 TypeScript 里&#xff0c;所有数字均为浮点数…...

SDL多线程编程

文章目录 1. SDL 线程基础2. 线程同步3. 线程池4. 注意事项5. 示例:在多个线程中进行图形渲染和输入处理总结在 SDL(Simple DirectMedia Layer)中,多线程编程通常用于提高应用程序的响应性和性能,尤其是在需要同时处理多个任务的场景中,例如渲染、输入处理和音频等。SDL …...

【Netty4核心原理④】【简单实现 Tomcat 和 RPC框架功能】

文章目录 一、前言二、 基于 Netty 实现 Tomcat1. 基于传统 IO 重构 Tomcat1.1 创建 MyRequest 和 MyReponse 对象1.2 构建一个基础的 Servlet1.3 创建用户业务代码1.4 完成web.properties 配置1.5 创建 Tomcat 启动类 2. 基于 Netty 重构 Tomcat2.1 创建 NettyRequest和 Netty…...

C#语言的饼图

C#语言中的饼图&#xff1a;数据可视化的艺术 在现代软件开发中&#xff0c;数据可视化是一个不可或缺的重要环节。随着数据量的不断增加&#xff0c;仅仅依靠文本和表格来展示数据已显得不够直观。本文将以C#语言为基础&#xff0c;探讨如何使用C#绘制饼图&#xff0c;并进一…...

【AI学习】初步了解TRL

TRL&#xff08;Transformer Reinforcement Learning&#xff09; 是由 Hugging Face 开发的一套基于强化学习&#xff08;Reinforcement Learning, RL&#xff09;的训练工具&#xff0c;专门用于优化和微调大规模语言模型&#xff08;如 GPT、LLaMA 等&#xff09;。它结合了…...

打破界限:Android XML与Jetpack Compose深度互操作指南

在现有XML布局项目中逐步引入Jetpack Compose是现代Android开发的常见需求。本指南将全面介绍混合使用的最佳实践、技术细节和完整解决方案。 一、基础配置 1.1 Gradle配置 android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3…...

ADASH VA5 Pro中的route功能

这段内容详细介绍了 ADASH VA5 Pro 设备中“Route&#xff08;路线&#xff09;”模块的功能、操作流程以及相关特性。以下是对这段内容的总结和分析&#xff1a; Route 模块的主要功能 路线测量&#xff1a;Route 模块用于执行路线测量任务。它允许用户创建和管理一系列测量…...

阿里云oss视频苹果端无法播放问题记录

记录一下苹果端视频不可以播放的原因. 看了一下其他视频可以正常播放,但是今天客户发来的视频无法正常播放.咨询过阿里云售后给出的原因是编码格式过高. 需要调整编码格式为:baseline, 下面记录如何使用ffmpeg修改视频的编码格式. 下载文件(可从官方下载) 配置环境变量(系统变…...

网络安全的现状与防护措施

随着数字化和信息化的迅猛发展&#xff0c;互联网已成为人们日常生活、工作和学习不可或缺的一部分。然而&#xff0c;随着网络技术的普及&#xff0c;网络安全问题也日益突出。近年来&#xff0c;数据泄露、恶意软件、网络攻击等事件层出不穷&#xff0c;给企业和个人带来了巨…...

Ubuntu离线安装mysql

在 Ubuntu 24.04 上离线安装 MySQL 的步骤如下(支持 MySQL 8.0 或 8.4): 一.安装方法 此次安装是按照方法一安装,其它方法供参考: 安装成功截图: 安全配置截图: sudo mysql_secure_installation 登录测试: 方法一:使用 apt-rdepends 下载依赖包(推荐) 1. 在联网…...

移动通信网络中漫游机制深度解析:归属网络与拜访网络的协同逻辑

文章目录 一、漫游基础概念与网络架构1.1 漫游的核心定义1.2 关键网络实体角色 二、漫入漫出详细流程解析2.1 漫出&#xff08;Outbound Roaming&#xff09;场景2.2 漫入&#xff08;Inbound Roaming&#xff09;场景 三、归属网络与拜访网络的信任演进3.1 各代网络的信任模型…...

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__上

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…...

PyTorch使用(6)-张量形状操作

文章目录 1. reshape函数1.1. 功能与用法1.2. 特点 2. transpose和permute函数2.1. transpose2.2. permute2.3. 区别 3. view和contiguous函数3.1. view3.2. contiguous3.3. 特点 4. squeeze和unsqueeze函数4.1. squeeze4.2. unsqueeze 5. 应用场景6. 形状操作综合比较7. 最佳实…...

SpringBoot底层-数据源自动配置类

SpringBoot默认使用Hikari连接池&#xff0c;当我们想要切换成Druid连接池&#xff0c;底层原理是怎样呢 SpringBoot默认连接池——Hikari 在spring-boot-autoconfiguration包内有一个DataSourceConfiguraion配置类 abstract class DataSourceConfiguration {Configuration(p…...

数字内容个性化推荐引擎构建

实时数据驱动推荐优化 现代数字内容体验的核心竞争力在于系统对用户需求的即时捕捉与响应。通过实时数据流处理技术&#xff0c;推荐引擎能够同步采集用户点击、停留时长、交互轨迹等多维度行为数据&#xff0c;并借助分布式计算框架在毫秒级完成特征提取与模式识别。例如&…...

【工具】Redis管理工具推荐

【运维】Redis管理工具推荐 Another Redis Desktop Manager &#x1f680;&#x1f680;&#x1f680; 更快、更好、更稳定的Redis桌面(GUI)管理客户端&#xff0c;兼容Windows、Mac、Linux&#xff0c;性能出众&#xff0c;轻松加载海量键值 AnotherRedisDesktopManager 发行版…...

【高校主办】2025年第四届信息与通信工程国际会议(JCICE 2025)

重要信息 会议网址&#xff1a;www.jcice.org 会议时间&#xff1a;2025年7月25-27日 召开地点&#xff1a;哈尔滨 截稿时间&#xff1a;2025年6月15日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,Scopus 会议简介 JCICE 2022、JCICE 2023、JCICE 2…...

【区块链安全 | 第三十一篇】合约(五)

文章目录 合约库库中的函数签名和选择器库的调用保护合约 库 库与合约类似,但它们的目的是仅在特定地址上部署一次,并通过 EVM 的 DELEGATECALL(在 Homestead 之前是 CALLCODE)功能重复使用其代码。这意味着如果调用库函数,它们的代码将在调用合约的上下文中执行,即 th…...

系统与网络安全------Windows系统安全(8)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 DNS DNS概述 为什么需要DNS系统 www.baidu.com与119.75.217.56&#xff0c;哪个更好记&#xff1f; 互联网中的114查号台/导航员 DNS&#xff08;Domian Name System&#xff0c;域名系统&#xff09;的功…...