日期:2014-05-18 浏览次数:20835 次
select top 10
COUNT(wue.MeterNo) as num,
(m.MeterName+'('+RTRIM(wue.MeterNo)+')') as MeterNN,
(r.RegionName+' '+(ISNULL(b.BuildingName,''))) as RegionBuilding
from WarnUseEnergy wue
left join Meter m
on wue.MeterNo=m.MeterNo
left join BuildingMeterRef bmr
on wue.MeterNo=bmr.MeterNo
left join Building b
on bmr.BuildingNo=b.BuildingName
left join RegionMeterRef rmr
on wue.MeterNo=rmr.MeterNo
left join Region r
on rmr.RegionNo=r.RegionNo
where wue.MeterType=@MeterType
group by wue.MeterNo,m.MeterName,b.BuildingName,r.RegionName
order by num desc
--这么多left join ,用临时表或者试图吧
从你的语句上来说算法一点都不复杂
------解决方案--------------------
你这几个表,每个表大约有多少数据?
正常索引建好了200万数据1秒内是可以搞定的。
但是如果是多表连接查询就不同了,要看各表的数据量,和条件字段的索引等情况。
------解决方案--------------------
儘量使用INNER JOIN
在 WarnUseEnergy表上 建立複合索引 , (MeterNo,MeterType) 按這個順序.
CREATE NONCLUSTERED INDEX WarnUseEnergy_MeterNo_MeterType ON WarnUseEnergy(MeterNo,MeterType)
------解决方案--------------------
儘量使用INNER JOIN
在 WarnUseEnergy表上 建立複合索引 , (MeterNo,MeterType) 按這個順序.
CREATE NONCLUSTERED INDEX WarnUseEnergy_MeterNo_MeterType ON WarnUseEnergy(MeterNo,MeterType)
------解决方案--------------------
Inner Join 只會保留相匹配的數據
Left Join 會保留左表完整的數據
同理Right Join 會保留右表完整的數據
使用Left Join,這樣你WarnUseEnergy某些匹配不上的數據也會保留在結果裏面,導致執行速度過慢.
------解决方案--------------------
select top 10
COUNT(wue.MeterNo) as num,
(m.MeterName+'('+RTRIM(wue.MeterNo)+')') as MeterNN,
(r.RegionName+' '+(ISNULL(b.BuildingName,''))) as RegionBuilding
from [color=#FF0000](select * from WarnUseEnergy where wue.MeterType=@MeterType ) [/color]wue
left join Meter m
on wue.MeterNo=m.MeterNo
left join BuildingMeterRef bmr
on wue.MeterNo=bmr.MeterNo
left join Building b
on bmr.BuildingNo=b.BuildingName
left join RegionMeterRef rmr
on wue.MeterNo=rmr.MeterNo
left join Region r
on rmr.RegionNo=r.RegionNo
group by wue.MeterNo,m.MeterName,b.BuildingName,r.RegionName
order by num desc
------解决方案--------------------
题外话:最后一句‘order by num desc’是错的吧
------解决方案--------------------
提高效率的一般做法是用空间换时间
你把你要提取表的数据,都放到临时表里面,也就是MeterType=@MeterType 的时候的MeterNo都符合的数据,然后再把临时表left join。
这样子临时表的数据会少很多,left join的时候速度也会快很多
------解决方案--------------------
临时表一方面数据量少,另一方面是你独占的,所以查询速度会很快
我曾经做过一个存储过程执行要2小时,用临时表后只需要半小时