none
这个“存储过程”应该怎样优化 RRS feed

  • 问题

  • 这个“存储过程”应该怎样优化???

    这个“存储过程”应该怎样优化???

    执行时间为“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.


    2012年5月15日 0:48

答案

  • WarnUseEnergy”表,200多万

    其他表都小,而且是 LEFT JOIN 的右边表

    所以主要关心的是 WarnUseEnergy 这个表(从语句上看,过滤的条件是最重要的),如果满足条件的,是这个表的绝大部分数据,那么可优化的空间很小,否则,在条件字段上建立索引是非常重要的

    2012年5月15日 5:15
  • 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.

    2012年5月21日 3:32

全部回复

  • 或许你可以试着利用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/

    2012年5月15日 0:51
  • 首先,WarnUseEnergy表的MeterType列是应该有索引的。
    bty,这个查询的快慢很大程度上取决于你WarnUseEnergy表的MeterType值重复度。

    Best Regards, nicofer

    2012年5月15日 2:08
  • 试一下下面的:

    WarnUseEnergy 表的MeterType,MeterNo 建非聚集索引;
    Meter 表的MeterNo ,MeterName 建联合非聚集索引;
    BuildingMeterRef表的MeterNo,BuildingNo 建联合非聚集索引;

    至于Building 表,你的连接是 on bmr.BuildingNo=b.BuildingName ??没写错吧?

    RegionMeterRef表的MeterNo,RegionNo 建联合非聚集索引;
    Region 表的MeterNo ,MeterName 建联合非聚集索引。

     


    2012年5月15日 2:11
  • You can check execution plan of the query, sql2k8 ssms will tell you if missing any index.
    2012年5月15日 2:28
  • WarnUseEnergy”表,200多万

    其他表都小,而且是 LEFT JOIN 的右边表

    所以主要关心的是 WarnUseEnergy 这个表(从语句上看,过滤的条件是最重要的),如果满足条件的,是这个表的绝大部分数据,那么可优化的空间很小,否则,在条件字段上建立索引是非常重要的

    2012年5月15日 5:15
  • WarnUseEnergy”表,200多万

    其他表都小,而且是 LEFT JOIN 的右边表

    所以主要关心的是 WarnUseEnergy 这个表(从语句上看,过滤的条件是最重要的),如果满足条件的,是这个表的绝大部分数据,那么可优化的空间很小,否则,在条件字段上建立索引是非常重要的

    谢谢各位,谢谢大家。

        除了建立索引提高查询速度,还有其它什么方式可以优化性能???

         


    Science and technology is my lover.

    2012年5月21日 2:48
  • 试一下下面的:

    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.



    2012年5月21日 2:57
  • 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.

    2012年5月21日 3:32