积极答复者
这个“存储过程”应该怎样优化

问题
-
这个“存储过程”应该怎样优化???
这个“存储过程”应该怎样优化???
执行时间为“20秒”,目标要控制在“5秒”以内,表(WarnUseEnergy)中的数据量有“200多万”。
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
“WarnUseEnergy”表,200多万。
“Meter”表一千多条。
“BuildingMeterRef”表,1千多条。
“Building”表,几百条。
“RegionMeterRef”表,1千多条。
“Region”表几十条。
应该怎样建立“索引”,在那几个字段上建立???
优化方式有哪些???应该怎样优化???
Science and technology is my lover.
- 已编辑 starrycheng 2012年5月15日 0:49
答案
-
WarnUseEnergy”表,200多万
其他表都小,而且是 LEFT JOIN 的右边表
所以主要关心的是 WarnUseEnergy 这个表(从语句上看,过滤的条件是最重要的),如果满足条件的,是这个表的绝大部分数据,那么可优化的空间很小,否则,在条件字段上建立索引是非常重要的
- 已建议为答案 Molly Chen_Moderator 2012年5月17日 3:13
- 已标记为答案 Molly Chen_Moderator 2012年5月30日 6:46
-
1. it says create non-clustered (not clustered) index on multiple columns with 'create index' statement, books online has syntax.
2. again, books online tells you different joins and when to use each of them.
- 已标记为答案 Molly Chen_Moderator 2012年5月30日 6:46
全部回复
-
或许你可以试着利用SQL Server Database Engine Tuning Advisor来协助你改善查询效能。
http://www.dotblogs.com.tw/jimmyyu/archive/2009/10/13/11039.aspx,Gipi
以上說明若有錯誤請指教,謝謝。
http://www.dotblogs.com.tw/terrychuang/
-
试一下下面的:
WarnUseEnergy 表的MeterType,MeterNo 建非聚集索引;
Meter 表的MeterNo ,MeterName 建联合非聚集索引;
BuildingMeterRef表的MeterNo,BuildingNo 建联合非聚集索引;至于Building 表,你的连接是 on bmr.BuildingNo=b.BuildingName ??没写错吧?
RegionMeterRef表的MeterNo,RegionNo 建联合非聚集索引;
Region 表的MeterNo ,MeterName 建联合非聚集索引。- 已编辑 Jacky_shen 2012年5月15日 2:12
-
WarnUseEnergy”表,200多万
其他表都小,而且是 LEFT JOIN 的右边表
所以主要关心的是 WarnUseEnergy 这个表(从语句上看,过滤的条件是最重要的),如果满足条件的,是这个表的绝大部分数据,那么可优化的空间很小,否则,在条件字段上建立索引是非常重要的
- 已建议为答案 Molly Chen_Moderator 2012年5月17日 3:13
- 已标记为答案 Molly Chen_Moderator 2012年5月30日 6:46
-
试一下下面的:
WarnUseEnergy 表的MeterType,MeterNo 建非聚集索引;
Meter 表的MeterNo ,MeterName 建联合非聚集索引;
BuildingMeterRef表的MeterNo,BuildingNo 建联合非聚集索引;至于Building 表,你的连接是 on bmr.BuildingNo=b.BuildingName ??没写错吧?
RegionMeterRef表的MeterNo,RegionNo 建联合非聚集索引;
Region 表的MeterNo ,MeterName 建联合非聚集索引。
谢谢您。。。
也就是所有的“Join”操作,都使用“联合聚集索引”,对吧???
还有点疑问。
问题一:“联合聚集索引”和“聚合索引”有什么不同??? 创建“联合聚集索引”的语句是什么???
问题二:还有其它什么优化方式么??? “Inner join”是不是比“Left join”和“Right join”消耗资源???
有个朋友说:
存储过程中 公用语句或字段多使用参数 ,减少代码行数 , 提高代码可读性 , 减少运算次数
Science and technology is my lover.
- 已编辑 starrycheng 2012年5月21日 3:07
-
1. it says create non-clustered (not clustered) index on multiple columns with 'create index' statement, books online has syntax.
2. again, books online tells you different joins and when to use each of them.
- 已标记为答案 Molly Chen_Moderator 2012年5月30日 6:46