优化具有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
正如列文指出的那样,你可以删除TD0
,TD1
和TP1
,因为它们是多余的。
您也可以删除row_number
列,因为没有使用该列,并且窗口功能相对昂贵。
如果不使用它们,也可以从TT
CTE中删除一些表格;但是,由于表名并未包含在每个选定的列中,因此无法确定哪些表未被使用。
除此之外,您的查询的响应总是与返回的行数成正比,因为RDBMS必须读取返回的每一行来计算结果。
+1进行更彻底的分析。 – 2012-03-21 12:58:36
谢谢,马克。看起来有一个连接导致这种延迟 - 与模型表的连接。但是,这张表只包含了7000条记录,但还不清楚为什么需要那么多时间。 – mohammedn 2012-03-21 14:13:27
@mohammedn - 你能发布执行计划吗? – 2012-03-21 14:15:55
请确保您有每个外键的支持索引也很可能这不是问题,但MS SQL优化更适用于内连接。 此外,如果您只需要总计,我看不到任何您需要RowNum的原因。
您只选择'TT'的输出。删除TD0,TD1和TP1,因为它们是冗余的。 – 2012-03-21 12:39:09
这些表格不是这个问题的根源。这是查询COUNT和SUM – mohammedn 2012-03-21 12:44:35
如果你知道你应该从一开始就删除它们。很多人只会继续前进。通过发布长时间查询,你正在破坏自己。 – 2012-03-21 13:01:56