我有一個需要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