2017-08-23 15 views
0

ユーザーカウントを取得する必要があります。 WHERE句にORという条件を追加すると、クエリの実行に時間がかかります。このSQLクエリを最適化して実行時間を最小限に抑えるにはどうすればよいですか?SQL ServerのOR句で左結合

SELECT SM.ModelId, 
    SM.NameID, 
    U.UserCount INTO #SM 
FROM Mapper AS SM (NOLOCK) CROSS APPLY (
SELECT COUNT(DISTINCT U.UserNumber) AS UserCount 
FROM Team T (NOLOCK) 
JOIN Equ E (NOLOCK) ON T.Equid = E.Equid 
JOIN EquReq ER (NOLOCK) ON E.EquReqid = ER.EquReqid 
LEFT JOIN Information I (NOLOCK) ON T.Equid = I.Equid 
JOIN USER U (NOLOCK) ON ER.Key = U.Key 
WHERE (T.NameID = SM.NameID 
    OR I.NameID = SM.NameID) 

答えて

0

あなたは以下を実行して試みることができる -

SELECT SM.ModelId, SM.NameID, U.UserCount 
    INTO #SM  
    FROM Mapper AS SM (NOLOCK) 
CROSS APPLY (SELECT COUNT(DISTINCT U.UserNumber) AS UserCount 
       FROM Team T (NOLOCK) 
       JOIN Equ E (NOLOCK) 
        ON T.Equid = E.Equid 
       JOIN EquReq ER (NOLOCK) 
        ON E.EquReqid = ER.EquReqid 
       LEFT JOIN Information I (NOLOCK) 
        ON T.Equid = I.Equid 
       JOIN User U (NOLOCK) 
        ON ER.Key = U.Key 
       WHERE T.NameID = SM.NameID 
       UNION 
       SELECT COUNT(DISTINCT U.UserNumber) AS UserCount 
       FROM Team T (NOLOCK) 
       JOIN Equ E (NOLOCK) 
        ON T.Equid = E.Equid 
       JOIN EquReq ER (NOLOCK) 
        ON E.EquReqid = ER.EquReqid 
       LEFT JOIN Information I (NOLOCK) 
        ON T.Equid = I.Equid 
       JOIN User U (NOLOCK) 
        ON ER.Key = U.Key 
       WHERE I.NameID = SM.NameID) 

それはあなたがクエリに対応するために、両方のT.NameID & I.NameIDで十分カバーするインデックスを持っていることを確認して、解決しない場合。あなたはまだ問題がある場合は

、私はあなたが以下の表の上に持っているもののインデックス教えてください -

チームT 情報I