SQL Server性能优化(3)使用SQL Server Profiler查询性能瓶颈

news/2025/1/11 16:52:44/文章来源:https://www.cnblogs.com/cairangdela/p/18665866

关于SQL Server Profiler的使用,网上已经有很多教程,比如这一篇文章:SQL Server Profiler:使用方法和指标说明。微软官方文档:https://msdn.microsoft.com/zh-cn/library/ms179428(v=sql.105).aspx有更详细的介绍。

经过使用Profiler进行监视,得到监视结果。

image

==================================以下是和文章标题无关的内容,举例说明优化语句=========================================

一个查询耗时非常大的语句

select t.表地址,t.当前热量,t.热功率,t.瞬时流量,t.累计流量,t.供水温度,t.回水温度,t.温差,t.累计工作时间,t.采集时间,t.社区编号,t.楼房编号,t.房间号
from measure_heat t
where 采集时间 = (select max(采集时间) from measure_heat where 表地址 = t.表地址 and 采集时间 >= '2013-11-11'  and 采集时间 <= '2014-4-11')

这是一个用max函数查询大范围数据的语句。经过查询计划发现,采集时间列没有索引,导致查询时会有扫描表的操作。后来给采集时间列加上索引,再采用不同的查询语句进行分析。以下是分析结果

复制代码
--如果查询很大范围的数据库,发现使用max函数是效率最高的,其他的排序函数效率一般。
--因为采集时间是有序的
------------------------使用max函数--------------------------
SET STATISTICS IO ON
DBCC DROPCLEANBUFFERS    --关闭缓存
DBCC FREEPROCCACHE        --关闭缓存
SELECT t.表地址, t.当前热量, t.热功率, t.瞬时流量, t.累计流量, t.供水温度, t.回水温度, t.温差, t.累计工作时间, t.采集时间,t.社区编号,t.楼房编号,t.房间号 
FROM Measure_heat t 
WHERE 采集时间 = (---很多时间花在这个地方,也就是如何能获得一个表的最近的采集时间。select max(采集时间)     from measure_heat where 表地址 = t.表地址 and 采集时间 >= '2013-11-11'  and 采集时间 <= '2014-1-11')    ---------------------使用ROW_NUMBER函数-----------------------
--create nonclustered index testMeasure_heat on Measure_heat  (采集时间, 表地址)
SET STATISTICS IO ON
DBCC DROPCLEANBUFFERS    --关闭缓存
DBCC FREEPROCCACHE        --关闭缓存
--如果存在,删除缓存表
--IF exists(SELECT * FROM #TableID)--存入数据库内存表
SELECT * INTO #TableID FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY 房间号 ORDER BY 采集时间 DESC) as rowID, id  FROM Measure_heat WHERE 采集时间>='2013-11-1 0:00:00' AND  采集时间<='2014-1-11 0:00:00'--AND 房间号 = 119    
) T
WHERE T.rowID = 1
SELECT * FROM #TableID
SELECT t.表地址, t.当前热量, t.热功率, t.瞬时流量, t.累计流量, t.供水温度, t.回水温度, t.温差, t.累计工作时间, t.采集时间,t.社区编号,t.楼房编号,t.房间号 
FROM  Measure_heat T RIGHT JOIN #TableID b ON t.id = b.id
ORDER BY t.id
DROP table #TableID------------------------使用rank函数----------------------
DBCC DROPCLEANBUFFERS    --关闭缓存
DBCC FREEPROCCACHE        --关闭缓存
select * into #table2 from 
(SELECT 表地址, RANK() OVER (PARTITION BY 表地址 ORDER BY 采集时间) AS RankTestFROM Measure_heatWHERE 采集时间>='2013-11-1 0:00:00' AND 采集时间<='2014-1-11 0:00:00'
) t
where ranktest = 1
--SELECT * FROM #table2
SELECT t.表地址, t.当前热量, t.热功率, t.瞬时流量, t.累计流量, t.供水温度, t.回水温度, t.温差, t.累计工作时间, t.采集时间,t.社区编号,t.楼房编号,t.房间号 
FROM  Measure_heat T RIGHT JOIN  #table2 a on a.表地址 = t.表地址
AND T.采集时间 BETWEEN '2013-11-1 0:00:00' AND '2014-1-11 0:00:00'
drop table #table2
复制代码

另一个使用Min函数的语句,性能也非常差

select t.* 
from  Measure_heat t 
where 社区编号='13' and 采集时间 =(select min(采集时间 ) from  Measure_heat where 房间号 = t.房间号 AND 采集时间>='2013-11-6 0:00:00' AND  采集时间<'2013-11-7 0:00:00' )

image

解决方法,在sql中建立内存表,先查出一部分,再利用第一部分的结果查询最终结果。最终可以秒查。

复制代码
SET STATISTICS IO ON
DBCC DROPCLEANBUFFERS    --关闭缓存
DBCC FREEPROCCACHE        --关闭缓存
SELECT t.*
FROM  Measure_heat t 
WHERE 社区编号='13' and 采集时间 =
(SELECT min(采集时间 ) FROM  Measure_heat where 采集时间>='2013-11-6 0:00:00' AND  采集时间<'2013-11-7 0:00:00' AND 房间号 = t.房间号 
)
ORDER BY t.id------------使用内存表------------
SET STATISTICS IO ON
DBCC DROPCLEANBUFFERS    --关闭缓存
DBCC FREEPROCCACHE        --关闭缓存
--如果存在,删除缓存表
--IF exists(SELECT * FROM #TableID)
DROP table #TableID--存入数据库内存表
SELECT * INTO #TableID FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY 房间号 ORDER BY 采集时间 desc) as rowID, id  FROM Measure_heat WHERE 采集时间>='2013-11-6 0:00:00' AND  采集时间<'2013-11-7 0:00:00'AND 社区编号='13'    
) T
WHERE T.rowID = 1
--SELECT * FROM #TableID
SELECT a.*
FROM  Measure_heat a RIGHT JOIN #TableID b ON a.id = b.id
ORDER BY A.id


参考:
1. SqlServer性能检测和优化工具使用详细

复制代码

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

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

相关文章

SQL Server性能优化(2)获取基本信息

以下常用的SQL语句有利于我们分析数据库的基本信息,然后根据查询的结果进行优化。 1. 查看索引碎片无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引…

【floorplan_mesh_project】运行Distributed package doesnt have NCCL built in处理

Distributed package doesnt have NCCL built in报错:修改E:\develop\anaconda3\envs\meshgpt\lib\site-packages\torch\distributed\distributed_c10d.py init_process_group,手动设置后端为gloo(第1116行)

[P3899 [湖南集训] 更为厉害]

P3899 [湖南集训] 更为厉害 [湖南集训] 更为厉害 题目描述 设 \(\text T\) 为一棵有根树,我们做如下的定义:设 \(a\) 和 \(b\) 为 \(\text T\) 中的两个不同节点。如果 \(a\) 是 \(b\) 的祖先,那么称“\(a\) 比 \(b\) 更为厉害”。 设 \(a\) 和 \(b\) 为 \(\text T\) 中的两…

BurpSuite实操之解码器功能使用

解码器是一个进行手动执行或对应用程序数据者智能解码编码的工具。此功能可用于解码数据找回原来的数据形式,或者进行编码和数据加密。由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成.。编码、解码选项,目前支持URL、HTML、Base64、ASCI、十六进制、八进制、二…

sqoop--官方首页

https://sqoop.apache.org/

md学习DAY1

Markdown学习DAY1 标题 三级标题 四级标题 字体 粗体hello,world! 斜体hello,world! 斜体加粗hello,world! 废除hello,world! 引用选择疯狂包,成为包上包分割线图片超链接 点击跳转到疯狂包子的博客 列表A B CA B C表格姓名 性别 出生代码 public

CheeseTools:红队内网横向

免责声明 仅限用于技术研究和获得正式授权的攻防项目,请使用者遵守《中华人民共和国网络安全法》,切勿用于任何非法活动,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律连带责任项目介绍 这个库是基于已经存在的MiscTool制作的,所以非常…

2025 最新中国铁路路线地图 All In One

2025 最新中国铁路路线地图 All In One 中国铁路 12306 网站2025 最新中国铁路路线地图 All In One中国铁路 12306 网站高铁线路图中国高速铁路线路图 / 中国高铁线路规划图https://crh.gaotie.cn/ demosC3035 复 上海南 -> 亳州南 07:45 ~ 12:34 (04:49) 当日到达站序 站名…

JAVA-Day 12:方法的定义和调用

方法的定义和调用 方法定义的格式: public static void 方法名(){方法体(就是打包起来的代码)} 方法调用的格式: 方法名(); 定义调用一个方法用于个人介绍 public static void main(String[] args){myself(); } public static void myself(){System.out.println("小王同学…

PC电脑屏幕实时翻译工具-Translumo

点击上方蓝字关注我 前言 Translumo是基于.Net开发的、开源屏幕翻译器软件,它可以实时检测并翻译屏幕上所选区域中出现的文本,可检测视频中的字幕或图片中出现文字等 安装环境 [名称]:Translumo [大小]:500MB [版本]:0.9.6 [语言]:简体中文 [安装环境]:Windows 界面使用…

Text1-综合练习5

Text-综合练习5 产生十个1-100之间的随机数存入数组 求和 求平均数 找出有几个数字比平均值小 Random number1=new Random();Scanner number2=new Scanner(System.in);System.out.println("请输入要产生随机数的个数:");int n=number2.nextInt();int arr[]=new int […

Text1-综合练习6

Text-综合练习6 键盘录入n个数字,倒放他们的顺序 例如:输入1 2 3 4 5,输出5 4 3 2 1 Scanner EX=new Scanner(System.in);String arr[]=new String[100];String temp;int count=0;System.out.println("请输入要交换的数字:,以空格结束");for (int i = 0; i < 1…