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

dan*_*988 7 sql sql-server performance aggregate-functions

我有一个特殊的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'
Run Code Online (Sandbox Code Playgroud)

这里的问题是,当运行5天跨度时,此查询运行非常快(0:00到0:02),但是在6天的跨度内非常慢(1:20到1:45).

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

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

Der*_*omm 9

简短的回答:不,没有一些神奇的记录会导致MSSQL开始表现不佳.

现在,可能的查询不能很好地扩展,因此,数据集越大,其执行的指数越大.

您将遇到的一个大问题是您在UNIONED语句之后预测StartTime .相反,尝试在UNION之前的两个选择中预测它.这应该会产生巨大的差异,特别是如果你在StartTime上索引两个表(在这些表上生成索引).

SELECT * FROM (
SELECT *, ID & YearRec AS ID2 FROM MyFirstTable 
   WHERE STARTTIME >= '8/1/2011 00:00:00' 
   AND STARTTIME <= '8/5/2011 23:59:59'
UNION ALL SELECT *, ID & YearRec AS ID2 
FROM Table2011
   WHERE STARTTIME >= '8/1/2011 00:00:00' 
   AND STARTTIME <= '8/5/2011 23:59:59'
) AS TEMP 
Run Code Online (Sandbox Code Playgroud)

您也可以对代码进行一些额外的重构.


Raj*_*ore 4

不,聚合函数没有预先定义的上限。

性能偏差可能受到以下一项或多项因素的影响:

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

您可以在SSMS中运行查询并查看实际的执行计划。这将告诉您运行查询成本最高的地方,这将帮助您确定最佳的操作方案。

根据评论进行编辑:

如果没有Table2011包含的索引[STARTTIME],则创建一个。如果存在索引,但它被忽略,那么您必须找出原因。如果存在碎片,那么重建索引肯定会有帮助。这是重建方法

ALTER INDEX [YourIndexName] ON [dbo].[Table2011] REBUILD WITH (STATISTICS_NORECOMPUTE = ON);

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