读书人

语句如何优化啊运行太慢了还会出现死

发布时间: 2013-12-15 22:17:18 作者: rapoo

语句怎么优化啊?运行太慢了,还会出现死机
select a.buildname,b.ddate as [采集时间],b.MeterJSWD as [供温],b.MeterHSWD as [回温]
,b.MeterGY as [供压],b.MeterHY as [回压] ,b.MeterNJRL as [累计热量],b.MeterNLLL as [累计流量]
,b.Meterssll as [瞬时流量],b.Meterslrl as [瞬时热量]
,c.DoorNo,b.BuildNo,c.doorname,a.Totalhuanlu,b.bs
from TBuild as a
left join TMETERHistory2013 as b on a.BuildNo = b.BUILDNO
inner join TDoor as c on b.BuildNo = a.BUILDNO and c.DoorNo = b.DOORNO
where Meterstats = 0 and datediff(second,CONVERT(char(10),'2013-12-2 15:20:00',120) ,b.DDate) between CAST(((1 - 1 ) * 5 * 60 ) as nvarchar(100)) and CAST((1 * 5 * 60 ) as nvarchar(100)) and a.buildno=1211


语句如何优化啊运行太慢了,还会出现死机
[解决办法]
试试建个索引:

create index idx_TMETERHistory2013_cc on TMETERHistory2013(BUILDNO,DOORNO)

[解决办法]
右键绿色那个字,然后选查看丢失索引信息,把那个索引建了试试
[解决办法]
建索引没用,典型的表扫描
改指令是正道
[解决办法]
引用:
试试建个索引:

create index idx_TMETERHistory2013_cc on TMETERHistory2013(BUILDNO,DOORNO)


但是没有用上这个索引。

那就先强制使用索引试试:

left join TMETERHistory2013 with(index (索引名称))as b
[解决办法]
把上面提示的缺失索引先建上去.....
[解决办法]
或者试试这个:

update statistics TMETERHistory2013


[解决办法]
引用:
Quote: 引用:

建索引没用,典型的表扫描
改指令是正道

怎么改指令?


改写语句呗,不过这个是最后的办法,而且也不一定有效
[解决办法]
因为你这些列都用到了,但是上面没索引,可能会导致书签查找,增加额外的IO,先加上去吧,除非改语句
[解决办法]
引用:
Quote: 引用:

把上面提示的缺失索引先建上去.....
提示建很多字段的索引,


对了,你的这几个表都有多少条记录呀:

TBuild
TMETERHistory2013
TDoor
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

把上面提示的缺失索引先建上去.....
提示建很多字段的索引,


对了,你的这几个表都有多少条记录呀:

TBuild
TMETERHistory2013
TDoor


TMETERHistory2013 有900万条


你的这个查询,是不是需要用到 这个表TMETERHistory2013的所有的 900万条数据呢? 还是之后用一小部分
[解决办法]
select a.buildname,b.ddate as [采集时间],b.MeterJSWD as [供温],b.MeterHSWD as [回温]    
,b.MeterGY as [供压],b.MeterHY as [回压] ,b.MeterNJRL as [累计热量],b.MeterNLLL as [累计流量]
,b.Meterssll as [瞬时流量],b.Meterslrl as [瞬时热量]
,c.DoorNo,b.BuildNo,c.doorname,a.Totalhuanlu,b.bs
from TBuild as a
left join TMETERHistory2013 as b on a.BuildNo = b.BUILDNO
inner join TDoor as c on b.BuildNo = a.BUILDNO and c.DoorNo = b.DOORNO
where Meterstats = 0 and datediff(second,CONVERT(char(10),'2013-12-2 15:20:00',120) ,b.DDate) between CAST(((1 - 1 ) * 5 * 60 ) as nvarchar(100))


and CAST((1 * 5 * 60 ) as nvarchar(100)) and a.buildno=1211



a.BuildNo = b.BUILDNO
这个条件出现了2次。
另外最后的时间范围字段,最好改写成b.DDate between ... and ... 形式。
索引在能够过滤大部分记录的字段上新建

读书人网 >SQL Server

热点推荐