我有一个需要1分钟执行的查询。在查询中花费了一些时间之后,我发现有一部分实际上导致查询耗费时间。 请在下面查看我提出的查询的意见。如何提高多个内部联接的查询性能?
完整的查询:
SELECT DISTINCT
CSU.*, U.txtFirstName, U.txtLastName
FROM
tblCRMShallowUsers CSU (NOLOCK)
INNER JOIN
tblUsers U (NOLOCK) ON CSU.PK_autUserID = U.PK_autUserID
INNER JOIN
tblUserGroupLink UGL (NOLOCK) ON U.PK_autUserID = UGL.FK_lngUsersID
INNER JOIN
tblModuleSecurityLinks MSL (NOLOCK) ON FK_lngModuleID = 28
INNER JOIN
tblGroups G (NOLOCK) ON G.PK_autGroupID = MSL.FK_lngGroupID
WHERE
MSL.lngRights > 0
AND U.lngStatus > 19
AND U.ysnAdminFlag = 0
AND G.lngStatus > 19
AND G.ysnFrontEndGroup = 0
AND (UGL.FK_lngGroupID = MSL.FK_lngGroupID
OR UGL.FK_lngGroupID = 2)
ORDER BY
ysnHasAccess DESC, txtLastName, txtFirstName
下面联接在上面的查询快速执行:
INNER JOIN
tblUsers U (NOLOCK) ON CSU.PK_autUserID = U.PK_autUserID
INNER JOIN
tblUserGroupLink UGL (NOLOCK) ON U.PK_autUserID = UGL.FK_lngUsersID
INNER JOIN
tblModuleSecurityLinks MSL (NOLOCK) ON FK_lngModuleID = 28
INNER JOIN
tblGroups G (NOLOCK) ON G.PK_autGroupID = MSL.FK_lngGroupID
这里的及部分在真的减缓下来上面的查询。当我删除这个连接,它正在非常快,但结果集是不是更早到来的结果。(返回更多的数据)
AND (UGL.FK_lngGroupID = MSL.FK_lngGroupID
OR UGL.FK_lngGroupID = 2)
我真的很感激,如果你能表现出一定的方向,以优化查询或者编写相同查询的一些示例或其他方式。
您是否尝试过加入适量的索引到你的表? –
集[坏习惯踢 - 把NOLOCK到处(http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 是*不推荐*到处使用这个 - 恰恰相反! –
https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query即在代码中添加一些'create ...'和'insert ...'行,为测试和演示奠定基础。 – Yunnosch