Ich habe eine Abfrage, die 1 Minute dauert, um auszuführen. Nachdem ich einige Zeit mit der Abfrage verbracht habe, habe ich festgestellt, dass es einen Teil gibt, der die Abfrage tatsächlich dazu veranlasst, sich die Zeit zu nehmen. Bitte beachten Sie meine Kommentare unten für die Abfrage erwähnt.Wie kann die Abfrageleistung für mehrere innere Verknüpfungen verbessert werden?
komplette Abfrage:
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
Below Joins ausführen schnell in der obigen Abfrage:
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
Hier ist das UND-Teil in der obigen Abfrage, die es wirklich verlangsamt. Wenn ich diese entfernen beitreten es sehr schnell gearbeitet, aber die Ergebnismenge ist nicht das Ergebnis, das früher kommen würde. (Es mehr Daten zurückgibt)
AND (UGL.FK_lngGroupID = MSL.FK_lngGroupID
OR UGL.FK_lngGroupID = 2)
Ich würde wirklich schätzen, wenn Sie irgendeine Richtung zeigen kann, um die Abfrage zu optimieren oder ein Beispiel oder eine andere Möglichkeit, dieselbe Abfrage zu schreiben.
Haben Sie versucht, das Hinzufügen richtigen Indizes Tabellen? –
Set [Schlechte Angewohnheiten, NOLOCK überall hinzuschieben] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - es ist * nicht empfehlenswert *, dies überall zu benutzen - im Gegenteil! –
https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query ZB fügen Sie einige Zeilen von 'create ...' und 'insert ...' in Ihren Code ein, um eine Grundlage für Tests und Demonstrationen zu geben. – Yunnosch