2016-10-25 2 views
0

Ich bin kein Entwickler, also brauche Hilfe beim Umschreiben dieser Abfrage ohne einen inneren Join, da ich denke, das ist das Kernproblem. Dies läuft über 20 Sekunden. Kleinere Brocken laufen in weniger als einer Sekunde. Pl Hilfe.Rewrite-Abfrage mit kartesischem Produkt

select a.compID, b.InitialRT, b.VwRgts, b.UpdRgts, b.InsRgts, b.delRgts, b.Sscrnum , c.UserID 
from tablecmpy a, tbldetrght b (nolock) 
inner join tableuser c (nolock) on c.GroupID = b.UserId 
where b.RecType='G' 
and b.compID='[ALL]' 
and b.InitialRT+b.VwRgts+b.UpdRgts+b.InsRgts+b.delRgts > 0 
+1

Es wäre extrem unwahrscheinlich, dass Sie * schnellere * Ergebnisse von einem kartesischen Join erhalten würden ... ganz zu schweigen von Ergebnissen, die Ihren Anforderungen entsprechen. Es scheint mir, dass Sie eine Verbindung auf 'c.groupid = b.groupid' haben müssen, so dass das ist. Vielleicht sehen Sie sich Ihre EXPLAIN an und investieren Ihre Zeit in entsprechende Indizes, um Ihre Joins und Ihre 'WHERE'-Bedingungen abzudecken. – JNevill

Antwort

0

Du hast bereits cartesianischen join (alten Stil verbindet) hier from tablecmpy a, tbldetrght b (nolock). Versuchen Sie zu verwenden:

SELECT a.compID, 
     b.InitialRT, 
     b.VwRgts, 
     b.UpdRgts, 
     b.InsRgts, 
     b.delRgts, 
     b.Sscrnum, 
     c.UserID 
FROM tablecmpy a (nolock) 
CROSS JOIN tbldetrght b (nolock) 
INNER JOIN tableuser c (nolock) 
    ON c.GroupID = b.UserId 
WHERE b.RecType='G' 
    AND b.compID='[ALL]' 
    AND COALESCE(b.InitialRT,0) + 
     COALESCE(b.VwRgts,0) + 
     COALESCE(b.UpdRgts,0) + 
     COALESCE(b.InsRgts,0) + 
     COALESCE(b.delRgts,0) > 0 

Ich weiß nicht, ob Sie NULL in b.columns haben, so dass ich hinzufügen COALESCE sie zu handhaben.