2017-12-05 12 views
0

だから、私はかなり単純なクエリを使っていますが、非常に遅いです。SQLの複数の左結合はパフォーマンスが悪い

クエリを最適化する良い方法はありますか? LEFT JOINSを複数の列で分割する必要がありますか?複数回実行してUnion ALLを使用して一緒に参加するのはどうですか?

テーブルには50万行の行があり、索引付けされています。 enter image description here 助けてください。クエリは、あなたのLEFT JOIN秒でOR sがすべてでパフォーマンスを支援していない

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

これはsprocですか?おそらくパラメータスニッフィングの問題?計画はここで長い道のりを行くだろう。 –

+0

@Rigerta。十分に十分です。行 上記の実行計画を上記に追加しました – JCircio

+0

@Jacobストアドプロシージャではありません – JCircio

答えて

1

を実行するために、永遠にかかります。別のクエリに分割し、結果を一緒にUNIONに分割する必要があります。 Vykintasの回答から、次のようになります。

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 
関連する問題