关于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 社区编号='' 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 社区编号='' 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 社区编号=''
) 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性能检测和优化工具使用详细

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

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

    原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...

  2. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

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

    原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投 ...

  4. SQL Server 性能优化之——系统化方法提高性能

    SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...

  5. SQL Server性能优化与管理的艺术 附件下载地址

    首先感谢读者们对鄙人的支持,购买了<SQL Server性能优化与管理的艺术>,由于之前出版社的一些疏忽,附件没有上传成功,再次本人深表歉意. 请需要下载附件的读者从下面链接下载,谢谢: ...

  6. SQL Server性能优化(6)查询语句建议

    1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...

  7. SQL SERVER性能优化综述

    SQL SERVER性能优化综述 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照软 ...

  8. SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)

      SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1) 安装Quick Start工具 RML(Replay Markup Language)是MS ...

  9. 【SQL Server性能优化】删除大量数据的方法比较

    原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...

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

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

随机推荐

  1. vim插件之SnipMate

    SnipMate简介 snipMate一款功能强大的代码补齐插件,可自定义代码模板,并具备单词补齐的功能. vim插件snipMate下载地址 SnipMate安装 将snipMate.zip解压到~ ...

  2. C#winform导出数据到Excel的类

    /// <summary> /// 构造函数 /// </summary> public ExportData() { } /// <summary> /// 保存 ...

  3. c#使用DocX给word添加目录TOC

    刚要做目录的时候,我就想DocX应该提供了这个方面的函数.于是我就在讨论区搜索,看看别人是怎么用的. 我搜索了catalog; catalogue; list; contents;,但是都没有和目录有 ...

  4. ASP.NET的错误处理机制之二(实例log4net)

    一.log4net下载:http://logging.apache.org/log4net/download_log4net.cgi 二.web.config配置如下: <?xml versio ...

  5. Discuz X3.2 分区 gid 完美伪静态方法 Apache/Nginx

    Discuz 官方给出的伪静态规则并不完整,只实现了部分的伪静态设置及规则,分区 gid 仍然是 forum.php?gid=xxx 的形式,对于有强迫症的我是无法忍受的,下面给出分区 gid 的伪静 ...

  6. JS中cookie的基本使用

    cookie是本身是HTML中ducument中的一个属性,可以用来保存一些简单的数据信息,比如用户名.密码等,提高一些网站的用户体验度.下面就来简单的说说cookie,它有下面几个特性: 1.有过期 ...

  7. 【Apache】2.4.6版本的安装和配置

  8. 禁止 PC端打开网页 进行跳转

    try {var urlhash = window.location.hash;if (!urlhash.match("fromapp")){if ((navigator.user ...

  9. 会写网页 就会写手机APP -- Hybrid Mobile Apps for ASP.NET Developers

    您好,这篇文章是我的BLOG发出,原始出处在此: 会写网页 就会写手机APP -- Hybrid Mobile Apps for ASP.NET Developers http://www.dotbl ...

  10. 3.第一个python程序

    学习任何一门语言的第一步,首先要写个'hello world',这算是程序员的一个传统.但在写之前,还有注意几个问题. 首先,python是一门脚本语言,而脚本语言的特点就是:我们写的代码会先由解释器 ...