关于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. 《Linux运维趋势》2010-2013年全部期刊下载

    <Linux运维趋势>2010.rar <Linux运维趋势>2011_上.rar <Linux运维趋势>2011_下.rar <Linux运维趋势>2 ...

  2. 修改Hosts后对火狐不起作用解决办法

    修改Hosts后对火狐不起作用: 重启火狐浏览器仍不起作用的话,执行下面操作即可. FireFox - 选项 - 高级 - 网络 - 立即清除(缓存)  就解决了

  3. Web Service 中返回DataSet结果的几种方法

    Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象    特点:通常组件化的处理机制,不加任何修饰及处理:    优点:代码精减.易于处理,小数据量处理较快: ...

  4. 根据Ip获取城市帮助类

    思路构建 1.先通过本地的测IP地址库进行匹配 2.如果本地IP地址库存在此IP的城市信息,就直接返回,调用速度也快 3.如果本地没有对应的IP城市信息,必须通过调用网络的IP查询的API了,这里我使 ...

  5. c#学习之Socket网络编程

    我是新手以前没写过博客 希望大家勿喷, 在编写Socket的时候需要导入System.Net.Socket 命名空间.利用该类我们可以直接编写Socket的客户端和服务的的程序了, 这里我们只讲tpc ...

  6. Cassandra 有限分页策略

    瀑布式分页 如果你的应用只需要瀑布式的分页,那么,Cassandra可以很好的支持,不过记得要指定好排序顺序. CLUSTERING ORDER BY (add_time DESC); 常见的分页,跳 ...

  7. setting菜单界面的形成--未优化

    代码: first_preference.xml: <?xml version="1.0" encoding="utf-8"?> <Prefe ...

  8. Objective-C关于分类、扮演、协议

    -----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  9. 【转】Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败

    错误原因如下: Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot ...

  10. Android之Activity的几种跳转方式

     1.显示调用方法 Intent intent=new Intent(this,OtherActivity.class);  //方法1 Intent intent2=new Intent(); in ...