关于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. 如何利用CSS代码使图片和文字在同一行显示且对齐

    对于初学css的新手朋友来说,经常会遇到这样一个问题,当文字和图片出现在同一行或者同一个div里面的时候,在浏览器中运行出来的显示效果往往是在不同的行,那么,我们怎么才能利用CSS代码使图片和文字在同 ...

  2. 返回json格式时间,解析时间

    传入:Json格式的时间 JS如下: yyyy-M(MM)-d(dd) H(HH):m(mm):s(ss) function timeStamp2String(time) { var data=tim ...

  3. Vue.js学习 Item6 -- Class 与 样式绑定

    数据绑定一个常见需求是操作元素的 class 列表和它的内联样式.因为它们都是 attribute,我们可以用 v-bind 处理它们:只需要计算出表达式最终的字符串.不过,字符串拼接麻烦又易错.因此 ...

  4. 纯js拖拽参考

    function myDrag(obj){ obj.onmousedown=function(e){ var e=e||window.event; var diffX=e.clientX-this.o ...

  5. webshell + xss 猥琐刷某投票

    团队成员发来一个投票的地址,需要撸某某网站的一个某某投票,果断看了下,ip限制了,看到post 数据包 额 随便找个大流量shell post 数据 Js代码代码 <script type=&q ...

  6. [转]Openwrt的Inittab

    转来一篇关于启动的文章,特意收藏.http://see.sl088.com/wiki/Inittab 文件位于/etc/inittab编辑方法vi /etc/inittab初始内容::sysinit: ...

  7. eclipse导出Runnable Jar File在Launch Configuration中找不到类

    1.只要选择中你需要Launch Configuration中出现的类,右击Run AS -- Java Application 再次. 2.点击导出Export的时候,就可以看到类在列表中出现了. ...

  8. 【转载】MongoDB参数

    我们可以通过mongod --help查看mongod的所有参数说明,以下是各参数的中文解释. 基本配置–quiet# 安静输出 –port arg# 指定服务端口号,默认端口27017 –bind_ ...

  9. Lex+YACC详解

    1. 简介 只要你在Unix环境中写过程序,你必定会邂逅神秘的Lex&YACC,就如GNU/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一 ...

  10. swift学习(二)--基本运算符、字符串、集合操作

    在这一篇博客里面,我想要介绍一下swift里面一些常用的基本运算符,还有涉及到的字符串,集合操作.你会发现在swift里面还是有许多其他语言所不具有的特性运算操作的. 首先最基本的+,-,*,/,&g ...