需要使用聚合函数提高SQL查询的性能

我有一个特殊的SQL查询似乎遇到了一个神秘的性能问题.这是查询
SELECT COUNT(LengthOfTime) AS TotalTime,SUM(LengthOfTime) AS TotalLength,SUM(LengthOfTime) / COUNT(LengthOfTime) AS AverageTime,SUM(Pops) / COUNT(LengthOfTime) AS AveragePop 
  FROM ((SELECT * 
           FROM (SELECT *,ID & YearRec AS ID2 
                   FROM MyFirstTable 
                 UNION ALL 
                 SELECT *,ID & YearRec AS ID2 
                   FROM Table2011) AS TEMP 
          WHERE STARTTIME >= '8/1/2011 00:00:00' 
            AND StartTime <= '8/5/2011 23:59:59' ) AS TEMP2 
  JOIN AppleTable ON TEMP2.Reason = AppleTable.Skills ) 
  JOIN PeopleTable ON TEMP2.Operator = PeopleTable.Operators 
 WHERE AppleTable.[ON] = 1 
   AND PeopleTable.[ON] = 1 
   AND Rec_Type = 'SECRET AGENT'
@H_502_3@这里的问题是,当运行5天时,此查询运行得非常快(0:00到0:02),但是在6天的跨度内非常慢(1:20到1:45).

@H_502_3@表中每天大约有105,000条记录(MyFirstTable和Table2011).

@H_502_3@我的问题:在sql Server中发现严重的性能问题之前,您可以传递聚合函数的行数是否有上限? (目前使用的是2008 R2)

不,聚合函数没有预定义的上限. @H_502_3@性能偏差可能受以下一种或多种影响:

@H_502_3@>旧的和/或不合适的索引结构
>缓存执行计划
>缓存数据
>数据大小不统一(前五天是10行,而第六行是100 B行)

@H_502_3@您可以在SSMS中运行查询并查看实际的执行计划.这将告诉您运行查询的成本最高的位置,这将帮助您确定最佳操作过程.

@H_502_3@根据评论进行编辑:

@H_502_3@如果Table2011上没有包含[STARTTIME]的索引,则创建一个索引.如果有一个索引,但它被忽略了,那么你必须找出原因.如果碎片化,那么重建索引肯定会有所帮助.以下是如何重建

@H_502_3@ALTER INDEX [YourIndexName] ON [dbo].[Table2011] REBUILD WITH(STATISTICS_norECOmpuTE = ON);

@H_502_3@或者,您可以在SSMS中执行此操作 – 浏览到对象浏览器中的特定索引,右键单击并重建.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...