哪些索引使用四个连接优化此查询?

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)

Grz*_*lik 9

它并不总是有效,但试着:

  1. 将连接中的表从最小的一个重新排序到最大的一个.
  2. 使用子查询而不是ProjectTransaction表:

    JOIN(SELECT RefEmployeeID,RefProjectID FROM ProjectTransaction WHERE @from <= PTran.Date AND PTran.Date <= @to AND PTran.Type = 0)AS trans