2016-08-15 19 views
-1

NOT IN句のSQLクエリがありますが、実行には時間がかかりすぎます。誰でも下のクエリのNOT INを交換するのを手伝ってください。'NOT IN'を含むSQLクエリに時間がかかりすぎる

Select 
    RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)) AS Channel, 
    C.CorporateId, C.corporatename, 
    MAX(convert(date,E.C3DeletionVerification)) 
from 
    employee E, Corporate C, Partners P 
where 
    E.corporateid = C.corporateid 
    and C.partner = P.partnercode 
    and C.Corporateid not in (select CorporateId 
           from employee 
           where DeletionVerification is null 
           and CardNo IS NOT NULL 
           group by CorporateId) 
group by 
    RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)), 
    C.CorporateId, C.corporatename 
order by 
    MAX(convert(date, E.DeletionVerification)) 
+0

内側のクエリで 'group by'を削除して、 – HoneyBadger

+0

を開始することができます。実際の実行計画をxmlとテーブルの数として表示できますか? – TheGameiswar

+3

[古いスタイルのJOINを使用する] /sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 古いスタイルの*カンマで区切られたテーブルのリスト*スタイルはANSI - ** 92 ** SQL標準(** 20年以上前**)で*適切な* ANSI 'JOIN'構文に置き換えられ、その使用は避けてください –

答えて

0

以下のクエリで試してみてください。

SELECT 
    RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)) AS Channel, 
    C.CorporateId, C.corporatename,MAX(convert(date,E.C3DeletionVerification)) 
FROM employee E 
     JOIN Corporate C ON E.corporateid = C.corporateid 
     JOIN Partners P ON C.[partner] = P.partnercode 
WHERE NOT EXISTS (SELECT 1 
        FROM employee E1 
        WHERE E1.DeletionVerification is null 
          AND E1.CardNo IS NOT NULL 
          AND C.CorporateId=E1.CorporateId) 

GROUP BY RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)), 
      C.CorporateId, C.corporatename 
ORDER BY MAX(convert(date, E.DeletionVerification)) 
0

少し変更されているこのクエリを試してください。より効果的になることを願っています。

SELECT 
RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)) AS Channel, 
C.CorporateId, C.corporatename, 
MAX(CONVERT(date,E.C3DeletionVerification)) 
FROM employee E 
INNER JOIN Corporate C ON C.corporateid = E.corporateid 
INNER JOIN Partners P ON P.partnercode = C.partner 
WHERE NOT EXISTS(
    SELECT DISTINCT CorporateId 
    FROM employee 
    WHERE CorporateId = c.Corporateid 
    AND DeletionVerification IS NULL 
    AND CardNo IS NOT NULL 
) 
GROUP BY RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)), C.CorporateId, C.corporatename 
ORDER BY MAX(convert(date, E.DeletionVerification)) 
1

あなたはあなたのクエリのCTEを使用すると、以下のようにそれを使用することができます。

with emp as (select CorporateId 
           from employee 
           where DeletionVerification is null 
           and CardNo IS NOT NULL 
           group by CorporateId) 
Select 
    RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)) AS Channel, 
    C.CorporateId, C.corporatename, 
    MAX(convert(date,E.C3DeletionVerification)) 
from 
    employee E, Corporate C, Partners P , emp ep 
where 
    E.corporateid = C.corporateid 
    and C.partner = P.partnercode 
    and C.Corporateid <> ep.CorporateId 
group by 
    RIGHT(P.PARTNERDESCRIPTION, LEN(P.PARTNERDESCRIPTION) - CHARINDEX('-', P.PARTNERDESCRIPTION)), 
    C.CorporateId, C.corporatename 
order by 
    MAX(convert(date, E.DeletionVerification)) 

注:これはテストされていません。ありがとう

関連する問題