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

时间:2012-03-21 12:34:10

标签: sql sql-server-2008 sql-server-2005

我有以下查询,需要很长时间来检索大约70000条记录。我注意到执行时间与检索到的记录数成正比。我需要优化此查询,以便执行时间与检索的记录数不成比例。有什么想法吗?

;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 

2 个答案:

答案 0 :(得分:2)

正如Lieven所说,您可以删除TD0TD1TP1,因为它们是多余的。

您也可以删除row_number列,因为未使用该列,窗口函数相对较贵。

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

除此之外,您的查询响应将始终与返回的行数成比例,因为RDBMS必须读取返回的每一行以计算结果。

答案 1 :(得分:0)

确保每个外键都有支持索引,在这种情况下很可能不是问题,但MS SQL优化更适用于内连接。 如果你只需要总数,我也没有看到你为什么需要RowNum的原因。