优化具有SUM和COUNT函数的SQL查询

问题描述:

我有以下查询,它需要很长时间才能检索大约70000条记录。我注意到执行时间与检索记录的数量成正比。我需要优化此查询,以便执行时间与检索的记录数量不成比例。任何想法?优化具有SUM和COUNT函数的SQL查询

;WITH TT AS (
     SELECT TaskParts.[TaskPartID], 
     PartCost, 
     LabourCost, 
     VendorPaidPartAmount, 
     VendorPaidLabourAmount, 
     ROW_NUMBER() OVER (ORDER BY [Employees].[EmpCode] asc) AS RowNum 
     FROM [TaskParts],[Tasks],[WorkOrders], [Employees], [Status],[Models] 
     ,[SubAccounts]WHERE 1=1 AND (TaskParts.TaskLineID = Tasks.TaskLineID) 
AND (Tasks.WorkOrderID = [WorkOrders].WorkOrderID) 
AND (Tasks.EmpID = [Employees].EmpID) 
AND (TaskParts.StatusID = [Status].StatusID) 
And (Models.ModelID = Tasks.FailedModelID) 
And (SubAccounts.SubAccountID = Tasks.SubAccountID)AND (SubAccounts.GLAccountID = 5)) 
SELECT --* 
    COUNT(0)--, 
    SUM(ISNULL(PartCost,0)), 
    SUM(ISNULL(LabourCost,0)), 
    SUM(ISNULL(VendorPaidPartAmount,0)), 
    SUM(ISNULL(VendorPaidLabourAmount,0)) 
    FROM TT 
+3

您只选择'TT'的输出。删除TD0,TD1和TP1,因为它们是冗余的。 – 2012-03-21 12:39:09

+0

这些表格不是这个问题的根源。这是查询COUNT和SUM – mohammedn 2012-03-21 12:44:35

+0

如果你知道你应该从一开始就删除它们。很多人只会继续前进。通过发布长时间查询,你正在破坏自己。 – 2012-03-21 13:01:56

正如列文指出的那样,你可以删除TD0TD1TP1,因为它们是多余的。

您也可以删除row_number列,因为没有使用该列,并且窗口功能相对昂贵。

如果不使用它们,也可以从TT CTE中删除一些表格;但是,由于表名并未包含在每个选定的列中,因此无法确定哪些表未被使用。

除此之外,您的查询的响应总是与返回的行数成正比,因为RDBMS必须读取返回的每一行来计算结果。

+0

+1进行更彻底的分析。 – 2012-03-21 12:58:36

+0

谢谢,马克。看起来有一个连接导致这种延迟 - 与模型表的连接。但是,这张表只包含了7000条记录,但还不清楚为什么需要那么多时间。 – mohammedn 2012-03-21 14:13:27

+1

@mohammedn - 你能发布执行计划吗? – 2012-03-21 14:15:55

请确保您有每个外键的支持索引也很可能这不是问题,但MS SQL优化更适用于内连接。 此外,如果您只需要总计,我看不到任何您需要RowNum的原因。