2017-12-05 1 views
0

Also, ich habe eine ziemlich einfache Abfrage, die funktioniert, aber sehr langsam.SQL Multiple Left Joins Leistung ist schlecht

Gibt es eine bessere Möglichkeit, die Abfrage zu optimieren? Sollte ich die LINKEN VERBINDUNGEN auf mehreren Spalten ausbrechen? Wie wäre es mit mehreren Läufen und der Verwendung von Union ALL, um sie zusammenzuführen?

Die Tabellen haben vielleicht 500.000 Zeilen und sind gut indiziert. enter image description here Bitte helfen. Abfrage dauert ewig

SELECT 
ep.Id, 
ep.DisplayName, 
ep.EmailAddress, 
COALESCE(
    gs.DisplayNameMember + ' (' + gd.DisplayName + ')', 
    ea.DisplayName , 
    ep.TrusteeUserAccountName, 
    ep.Trustee 
) AS Trustee 

FROM 
dbo.ExchangePermissions ep WITH (NOLOCK) 

LEFT JOIN dbo.GroupDetail gd WITH (NOLOCK) ON (ep.Trustee = gd.[Identity] OR ep.Trustee = gd.DisplayName OR ep.TrusteeUserAccountName = gd.SamAccountName) 
LEFT JOIN dbo.GroupMemberShip gs WITH (NOLOCK) ON gd.name = gs.groupname 
LEFT JOIN dbo.ExchangeAccount ea WITH (NOLOCK) ON (ep.Trustee = ea.[Identity] OR ep.Trustee = ea.DisplayName OR ep.TrusteeUserAccountName = ea.SamAccountName) 

WHERE 
ep.OTHERID= @MyParameter 
+0

Ist das ein Sproc? Möglicherweise ein Parameter-Sniffing-Problem? Ein Plan würde hier einen langen Weg zurücklegen. –

+0

@ Rigerta. Fair genug .. Zeilen Ich habe den Ausführungsplan oben hinzugefügt – JCircio

+0

@Jacob kein gespeicherter proc – JCircio

Antwort

1

Die OR s in Ihrem LEFT JOIN s laufen überhaupt nicht die Leistung zu helfen. Sie sollten sie in separate Abfragen und UNION die Ergebnisse zusammen brechen. Arbeiten von Vykintas Antwort erhalten wir folgendes:

SELECT 
ep.Id, 
ep.DisplayName, 
ep.EmailAddress, 
COALESCE(
    gs.DisplayNameMember + ' (' + gd.DisplayName + ')', 
    ep.TrusteeUserAccountName, 
    ep.Trustee 
) AS Trustee 
FROM 
dbo.ExchangePermissions ep WITH (NOLOCK) 
LEFT JOIN dbo.GroupDetail gd WITH (NOLOCK) ON ep.Trustee = gd.[Identity] 
LEFT JOIN dbo.GroupMemberShip gs WITH (NOLOCK) ON gd.name = gs.groupname 
WHERE 
ep.OTHERID= @MyParameter 

UNION 

SELECT 
ep.Id, 
ep.DisplayName, 
ep.EmailAddress, 
COALESCE(
    gs.DisplayNameMember + ' (' + gd.DisplayName + ')', 
    ep.TrusteeUserAccountName, 
    ep.Trustee 
) AS Trustee 
FROM 
dbo.ExchangePermissions ep WITH (NOLOCK) 
LEFT JOIN dbo.GroupDetail gd WITH (NOLOCK) ON ep.Trustee = gd.DisplayName 
LEFT JOIN dbo.GroupMemberShip gs WITH (NOLOCK) ON gd.name = gs.groupname 
WHERE 
ep.OTHERID= @MyParameter 

UNION 

SELECT 
ep.Id, 
ep.DisplayName, 
ep.EmailAddress, 
COALESCE(
    gs.DisplayNameMember + ' (' + gd.DisplayName + ')', 
    ep.TrusteeUserAccountName, 
    ep.Trustee 
) AS Trustee 
FROM 
dbo.ExchangePermissions ep WITH (NOLOCK) 
LEFT JOIN dbo.GroupDetail gd WITH (NOLOCK) ON ep.TrusteeUserAccountName = gd.SamAccountName 
LEFT JOIN dbo.GroupMemberShip gs WITH (NOLOCK) ON gd.name = gs.groupname 
WHERE 
ep.OTHERID= @MyParameter