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

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

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

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

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

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 RankTest
    FROM Measure_heat
    WHERE 采集时间>=‘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‘ )

解决方法,在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
时间: 2024-10-15 06:54:48

SQL Server性能优化(3)使用SQL Server Profiler查询性能瓶颈的相关文章

【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率

原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题,我从业务上了解到,显然对他们公司而言,丢数是绝对不能允许的. 另外,他们说之前也用过SQL Server的全文检索,但速度不够快,不如用mongodb快,当然我不太清楚他们所谓快的具体定义,比如查询只需要1秒,还是1分钟.他们的系统现在采用的是SQL Server,通过复制来实现高可用性,因为他们

Sql Server 性能优化之包含列

Sql Server 性能优化之包含列 导读:数据数优化查询一直是个比较热门的话题,小生在这方面也只能算是个入门生.今 天我们就讲下数据库包含列这个一项的作用及带来的优化效果 引用下MSDN里面的一段解释: 当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显 著提高查询性能. 这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值:不 访问表或聚集索引数据,从而减少磁盘 I/O 操作 上面这一段什么意思呢? 意思就是说设置好包含列,能提高查询性能,减少IO输出.

SQL Server 性能优化(一)——简介

原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投入的硬件就可以减缓投入,从另外一个角度看来它就是节省了钱. 2.增加效率:对于客户来说,性能上去了,他们的工作效率也高了. 3.降低挫折感:性能底下,客户抱怨,无疑是对自己心灵上的打击. 二.性能误区: 性能误区 误区 现实 如果处理器使用率很高,那么需要添加更快的处理器 某一部分导致了性能问题 8

大话SQL Server性能优化(MSSQL高并发、性能调控、实践)

大话SQL Server性能优化(MSSQL高并发.性能调控.实践)网盘地址:https://pan.baidu.com/s/1KxdfcQD0XGD3M2ja_Y7UWQ 提取码:435v备用地址(腾讯微云):https://share.weiyun.com/5dTuZJ9 密码:xhmge4 本课程源于一家国内较知名的ERP厂商的一款产品出现性能问题后通过咨询服务解决了性能问题,然后根据自身多年技术培训.项目开发.产品研发与运维管理.软件公司内部咨询等经验,整理了在SQL Server 20

sql server 性能调优之 SQL语句阻塞查询

原文:sql server 性能调优之 SQL语句阻塞查询 在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后.就需要检查数据库是否有出现阻塞 当时数据库的生产环境中主表数据量超过2000w,子表数据量超过1亿,且更新和新增频繁.再加上做了同步镜像,很消耗资源. 这时就要新建一个会话,大概需要了解以下几点: 1.当前活动会话量有多少? 2.会话运行时间? 3.会话之间有没有阻塞? 4.阻塞时间 ? 查询阻塞的方法有很多.有sql

数据库性能优化一:SQL索引一步到位

SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头的在第二排,这样在找什么书就好说了,这个就是一个聚集索引,可是很多人借书找某某

SQL语句性能优化--LECCO SQL Expert

SQL语句的优化是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句. 人工智能自动SQL优化就是使用人工智能技术,自动对SQL语句进行重写,从而找到性能最好的等效SQL语句. 数据库性能的优化   一个数据库系统的生命周期可以分成:设计.开发和成品三个阶段.在设计阶段进行数据库性能优化的成本最低,收益最大.在成品阶段进行数据库性能优化的成本最高,收益最小. 数据库的优化通常可以通过对网络.硬件.操作系统.数据库参数和应用程序的优化来进行.最常见的优化手段就是对硬件的升级.根据统计,对网

Oracle DBA数据库高级工程师(下部)SQL语言+性能优化+数据复制

套餐介绍: Oracle DBA数据库高级工程师(下部)SQL语言+性能优化+数据复制 http://edu.51cto.com/pack/view/id-973.html 描述 Oracle DBA数据库高级工程师培训课程是风哥独自研发的精品实战课程,本路线图主要是让大家快速就业.高薪就业.课程内容以实战为主(占98%),理论为辅(占2%).本课程知识全面系统实用,结合风哥十年Oracle经验,囊括企业用到的所有知识点,课程包含大量实战案例,涉及Oracle核心技术及底层研究,从零开始学习Or

SQL之性能优化

 在实际应用中,数据库中的数据会有很多,若要从这些数据表中检索数据,就需要对系统进行优化,提高数据库系统的响应速度,下面就是日常一些查询优化的方法. 1.创建索引 索引可以提高数据库查询的速度,提高数据库的访问性能,但同时也会影响数据更新操作(例如插入.修改.删除)的速度. 如果WHERE子句中经常用到的某一列或者某几列创建索引 为数据表中经常需要执行排序操作的列创建索引 多表连接时,应该为数据表的连接列创建索引 对于需要不断更新的列,则不建议创建索引 2.优化查询语句 避免在SELECT语

VMWare ESX Server性能优化

VMWare ESX Server性能优化 vmware ESX server 是当前服务器市场上基于intel平台的最流行的虚拟软件产品.对比其他虚拟软件产品,如 GSX server 和ms virtual server,ESX的最大优点就是可以大大减少host系统所占用资源的.ESX server内核直接运行在硬件之上,而且系统稳定性和性能都有很大的提高. ESX server也很适合企业级应用,因为它支持重要的冗余功能,比如多路经,以及链路绑定.由于有诸如p2v vmotion 和vir