SQLServer性能优化(一)

news/2025/1/22 17:47:58/文章来源:https://www.cnblogs.com/ayy-200248/p/18501698

(一)、查询步骤

  1. 逻辑查询树
  2. 绑定(把逻辑树上的节点与数据库的实际对象进行绑定):索引,约束,看看都存不存在
  3. 绑定器进行优化阶段的输入:绑定树,尽可能寻找最优方案。优化方案太多了,inner join只有一种方案,三表关联有六种方案。有限的时间有限的资源它不一定会选择最优的。
  4. 执行计划会传入到执行引擎。

image

图标是运算符,将数据传递给下一个运算符直至返回结果。
口诀:从右向左、从下到上。
箭头方向指明其执行顺序,箭头的粗细表面数据的多少。

image

执行计划是基于成本选择的,sqlserver选择它认为成本较低的。成本的评估和优化的过程需要消耗很多资源。我们需要编写简单的健壮的sql去引导优化器生成更好的执行计划。

image
基于开销的优化(CBO)
阶段0: 分析出一系列执行计划(3张表)
阶段1:快速计划
阶段2:完全优化

SQLServer中有GETROW方法,层层执行之后层层返回。

  • 阻塞运算符:比如排序,等前一个数据都返回了再排序。(需要等待并获取数据,内存增加,开销大)
  • 非阻塞运算符:前面返回了马上处理数据,如top。(需要存储的数据量很少,内存较少)

(二)、优化方法论

扫描运算符:
表扫描:发生在堆表
聚集索引扫描:表中所有数据行都存在于聚集索引的叶子节点中,相当于全表扫描。
非聚集索引扫描:查询数据已经发生在已定义好的索引之中,此时非全表扫描,只需要取出索引包含的数据。此时称为覆盖索引。

*扫描操作被认为是最大性能杀手:需要等待磁盘IO、消耗内存存储数据。数据库缓存池空间不足,需要写数据到内存中,此时会运用淘汰算法,清理缓存中数据,之后再继续填充数据。当频繁出现大量数据淘汰、缓存中数据频繁交替,会造成数据库IO方面性能瓶颈。

查找运算符:一般发生在索引上,通过索引定位具体数据。
聚集索引查找:当where后的条件是主键。
非聚集索引查找

  1. 条件一样表一样。如果查询结果字段与条件一致-->100%。
  2. 如果需要查询的列不是索引字段,而查询条件是索引字段-->此时存在嵌套查询(Inner Join),其中是Index Seek与Key Lookup连表。先通过非聚集索引查找出索引字段,还需要通过标签在表中找出字段。详相当于索引和表进行连接,先通过索引字段找主键,之后通过主键查表。

*Lookup根据表类型不同,可以分为键查找(Key Lookup)和ID查找(RID Lookup)。如果有扫描出现或者存在标签查找,都会被认为有问题,但不一定要被修复。产生的多数原因是:索引缺失、索引没有被正确覆盖到语句中又或者是索引没有生效(可能是查询语句编码不规范导致)。

(三)、基本优化原则

  1. 为何要避免使用(select *):可以避免很多不必要的IO,减少字段输出,有效利用覆盖索引。
  2. 限制结果集大小:比如使用TOP字句、分页处理,避免大批量数据操作,有效使用索引,避免扫描操作带来大量IO及内存占用。不限制直接找到最后,尤其连表几十条数据会找到几百条无用数据。
  3. 对数据进行过滤优先考虑索引字段(筛选率高、重复率低于5%)。
  4. 不要在过滤字段使用任何计算(函数、逻辑计算),不要出现在等号左边,导致查询优化器无法使用索引。
  5. 模糊查询使用Like 'xx%'存在索引,而Like '%xx%'不会使用到。

(四)、Order by、Group by、Update

性能取决于参与排序操作的数据量大小。排序操作数据大于内存--->中间数据存放TempDB(磁盘)。
工作区内存(查询请求的内存空间大小),如果用完了也会丢给TempDB。
当并发量达到一定量级,TempDB比较繁忙时候,IO就会很繁忙。
eg:2亿 =》5G磁盘空间 =》物理磁盘IO写入文件,且TempDB为公共资源,会影响整个数据库实例。

观察执行计划,Group by与distinct基本差不多。

Update ==》先查询出符合条件语句再更新。SQLServer中update会优先对数据添加更新锁,当确定更新数据时再将更新锁转化为排他锁。而Select使用共享锁。所以update性能问题时容易造成阻塞。小数据量建议使用主键或唯一字段。

Delete ==》会使用排他锁,会影响表中索引,应该谨慎权衡数据查询与更新频率。不要因为过多索引而影响数据删除及更新的性能,为了保证完整性,删除时应该确保被修改的数据应该进行回滚操作的。SQLServer会把删除的整条数据记录在日志中。如果进行大批量数据删除,会记录大量到事务日志。如果日志文件存在IO瓶颈,那么可能导致阻塞,所以磁盘空间也会迅速增长。

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

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

相关文章

【Java】若以框架(ruoyi-master)——11.新建业务模块

二次开发 修改项目名称 二次开发的第一步,当然是将项目名称、图标、项目目录等更改为自己的项目了。若依框架修改器,可以一键修改Ruoyi框架包名、项目名等的工具。 地址:https://gitee.com/lpf_project/RuoYi-MT/releases完成后,可以按【打开输出目录】按钮。找到项目。 新…

VictoriaMetrics 中文教程(10)集群版介绍

VictoriaMetrics 中文教程系列文章:VictoriaMetrics 中文教程(01)简介 VictoriaMetrics 中文教程(02)安装 VictoriaMetrics 中文教程(03)如何配置 Prometheus 使其把数据远程写入 VictoriaMetrics VictoriaMetrics 中文教程(04)对接 Grafana 同时介绍 vmui VictoriaMe…

《使用Gin框架构建分布式应用》阅读笔记:p234-p250

《用Gin框架构建分布式应用》学习第13天,p234-p250总结,总17页。 一、技术总结 1.message broker (1)RabbitMQ 书里使用的是RabbitMQ(https://www.rabbitmq.com/),这里补充一点说明: docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0.2 a、访问管理…

Avalonia 已知问题 第二次 Composition Animation 无法播放

在 Avalonia 里面,如果多次加入 Composition 的 Animation 动画,将会看到第二次加入是停止播放动画的这是 Avalonia 的已知问题,我已经报告给官方,详细请看 https://github.com/AvaloniaUI/Avalonia/pull/17370 我尝试修复了此问题,请看 https://github.com/AvaloniaUI/Av…

读数据工程之道:设计和构建健壮的数据系统23批量获取的考虑因素

批量获取的考虑因素1. 批量获取的考虑因素 1.1. 批量获取,通常是获取数据的一种便捷方式1.1.1. 通过从源系统中抽取一个数据子集,根据时间间隔或累积数据的大小来获取数据1.2. 基于时间间隔的批量获取在传统ETL的数据仓库中很普遍1.2.1. 每天在非工作时间(也可以按其他频率)…

分段任意模型满足零样本6D对象姿态估计

6.11 SAM-6D:分段任意模型满足零样本6D对象姿态估计6.11.1 SAM-6D:分段任意模型满足零样本6D对象姿态估计概述零样本6D物体姿态估计涉及在杂乱场景中检测具有6D姿态的新物体,这对模型的可推广性提出了重大挑战。幸运的是,最近的Segment Anything Model(SAM)展示了非凡的零…

Educational Codeforces Round 171 div2(A~E)

Educational Codeforces Round 171 div2(A~E) Dashboard - Educational Codeforces Round 171 (Rated for Div. 2) - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <algorithm> #include <array> #include <bitset> #include <cassert&g…

基于STM32cubeMX 的 RT-Thread 的默认串口输出修改及内容修改

最近在学习RT-Thread, 随便做点小笔记, 方便焦虑小白找路 本随笔主要写两个问题, 1.默认UART2修改成其他UART; 2. 开机输出的内容修改 在RT-Thread 中 默认的系统输出串口是UART2; 如果想修改成其他串口(以UART1为例子), 分两步走, 1.1. 初始化 对应的串口 (也就是UART1) 1.2…

qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性

qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib、user32.lib 需要头文件:<dwmapi.h>、<windowsx.h>只显示重要代码1、去除原边框、加上阴影、Aero Snap以及其他动画特效 (1)头文件 #include &q…

Spring 框架:Java 开发者的春天

Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。一、关于Spring 1.1 简介 Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称…

Mooc下载器:中国大学mooc慕课视频课件课程下载工具,如何在电脑端下载中国大学mooc慕课视频课程课件资料到本地?

一. 安装中国大学mooc慕课课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/icourse163_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用…

千聊兴趣岛视频课件课程下载工具,如何在电脑端下载千聊兴趣岛视频课程课件到本地?

一. 安装千聊/兴趣岛课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/qlchat_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无…