我有以下查询,需要很长时间来检索大约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
答案 0 :(得分:2)
正如Lieven所说,您可以删除TD0
,TD1
和TP1
,因为它们是多余的。
您也可以删除row_number
列,因为未使用该列,窗口函数相对较贵。
如果不使用TT
CTE,也可以从{{1}} CTE中删除一些表格;但是,由于表名未包含在所选的每一列中,因此无法确定哪些表未被使用。
除此之外,您的查询响应将始终与返回的行数成比例,因为RDBMS必须读取返回的每一行以计算结果。
答案 1 :(得分:0)
确保每个外键都有支持索引,在这种情况下很可能不是问题,但MS SQL优化更适用于内连接。 如果你只需要总数,我也没有看到你为什么需要RowNum的原因。