Ole*_*nge 4 sql sql-server indexing join
我有一个SQL查询与四个表的内部联接,使用当前索引和查询结构需要超过30秒.我想尽快做到; 至少快于5秒.
我首先想到了非规范化,但是在这里读到通常应该可以通过正确的索引等进行优化.在这种情况下,我无法弄清楚.当前查询计划包含最小表上的索引扫描和其中一个内连接上的"无连接谓词"警告.
我们有以下表格(显示行数和相关字段):
TableName Rows Fields ------------------- ----- ---------------------------------------------- ProjectType 150 ProjectTypeID, ProjectTypeName Employee 200 EmployeeID, RefDepartmentID Project 0.2M ProjectID, RefProjectTypeID ProjectTransaction 3.5M Hours, RefEmployeeID, RefProjectID, Date, Type
查询应该总结给定部门,日期范围等的小时数.目前我尝试:
SELECT E.RefDepartmentID, SUM(PTran.Hours)
FROM Employee E
JOIN ProjectTransaction PTran
ON E.EmployeeID = PTran.RefEmployeeID
JOIN Project P
ON PTran.RefProjectID = P.ProjectID
JOIN ProjectType PType
ON P.RefProjectTypeID = PType.ProjectTypeID
WHERE E.RefDepartmentID = @departmentID
AND @from <= PTran.Date AND PTran.Date <= @to
AND PTran.Type = 0
AND PType.ProjectTypeName NOT IN (N'1', N'2', N'3')
GROUP BY E.RefDepartmentID
Run Code Online (Sandbox Code Playgroud)
感谢所有快速解答.(我已经在'外键'和WHERE条款中有索引.)我重新排序查询,先得到两个小表,然后是中等大小,最后是大表.瞧大约需要一秒钟:
SELECT E.RefDepartmentID, SUM(PTran.Hours)
FROM Employee E
JOIN ProjectType PType
ON E.RefCustomerID = PType.RefCustomerID
JOIN Project P
ON PType.ProjectTypeID = P.RefProjectTypeID
JOIN ProjectTransaction PTran
ON E.EmployeeID = PTran.RefEmployeeID
AND P.ProjectID = PTran.RefProjectID
WHERE E.RefDepartmentID = @departmentID
AND @from <= PTran.Date AND PTran.Date <= @to
AND PTran.Type = 0
AND PType.ProjectTypeName NOT IN (N'1', N'2', N'3')
GROUP BY E.RefDepartmentID
Run Code Online (Sandbox Code Playgroud)
它并不总是有效,但试着:
使用子查询而不是ProjectTransaction表:
JOIN(SELECT RefEmployeeID,RefProjectID FROM ProjectTransaction WHERE @from <= PTran.Date AND PTran.Date <= @to AND PTran.Type = 0)AS trans
| 归档时间: |
|
| 查看次数: |
4144 次 |
| 最近记录: |