首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2013-12-15 
语句怎么优化啊?运行太慢了,还会出现死机select a.buildname,b.ddate as [采集时间],b.MeterJSWD as [供温

语句怎么优化啊?运行太慢了,还会出现死机
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 ... 形式。
索引在能够过滤大部分记录的字段上新建

热点排行