2017-06-29 2 views
-4

Ich habe eine Select-Abfrage, die ich verbessern muss, um es schnell zu machen.SQL-Abfrage sehr langsam und muss verbessert werden

SELECT 
    st.SigHistUID, st.RelationType, st2.RelationType, 
    case 
     when st.RelationType <> st2.RelationType 
      then 'N' 
      else st.RelationType 
    end as [NewRelationType], 
    st.ToSigUID , sh.FullDescription, sh.SigHistUID AS ToSigHistUID 
FROM 
    [Stackability] (nolock) st 
INNER JOIN 
    [SignatureHistory] (nolock) sh ON sh.SigUID = st.ToSigUID 
            AND sh.SigHistUID = (SELECT TOP 1 SigHistUID FROM [SignatureHistory] (nolock) tmp where tmp.SigUID = sh.SigUID ORDER BY SigHistUID DESC) 
INNER JOIN 
    [SignatureHistory] (nolock) sh2 ON st.SigHistUID = sh2.SigHistUID 
INNER JOIN 
    Stackability (nolock) st2 on st2.ToSigUID = sh2.SigUID and st2.SigHistUID = sh.SigHistUID 
WHERE 
    st.SigHistUID < 1000 and 
    st.RelationType <> st2.RelationType 
ORDER BY 
    st.SigHistUID 
+8

Dies ist ** Art und Weise zu wenig ** Informationen! Was sind die Tabellenstrukturen? Welche Art von Indizes sind auf diesen Tabellen definiert? Welche Art von Daten (in Bezug auf ** Volumen **) hat jede Tabelle ?? –

+4

Zumindest sollten Sie [den aktuellen Ausführungsplan] (https://stackoverflow.com/a/7359705/1260204), Sie könnten [den Plan einfügen] (https://www.brentozar.com/pastetheplan /) und teilen Sie den Link in Ihrer Frage. Auch [versuche es selbst zu lesen] (https://stackoverflow.com/a/759097/1260204), vielleicht kannst du das Leistungsproblem mit deiner Frage herausfinden. Schließen Sie schließlich die [schema ddl] (https://en.wikipedia.org/wiki/Data_definition_language) mit der von Ihnen ausgeführten Abfrage ein. – Igor

+0

Abhängig von der Größe von SignatureHistory kann Ihre Unterabfrage den SH-Join verlangsamen, da die Unterabfrageergebnisse nicht indiziert sind. Vielleicht finden Sie einen Weg, diese Unterabfrage zu vermeiden. – justiceorjustus

Antwort

0

Versuch, der den Top-1 Zustand entnommen:

SELECT 
    st.SigHistUID, st.RelationType, st2.RelationType, 
    case 
     when st.RelationType <> st2.RelationType 
      then 'N' 
      else st.RelationType 
    end as [NewRelationType], 
    st.ToSigUID , sh.FullDescription, sh.SigHistUID AS ToSigHistUID 
FROM 
    [Stackability] (nolock) st 
INNER JOIN 
    (select distinct siguid, max(SigHistUID) OVER(PARTITION BY siguid) as SigHistUID from [SignatureHistory] (nolock)) sh ON sh.SigUID = st.ToSigUID 

INNER JOIN 
    [SignatureHistory] (nolock) sh2 ON st.SigHistUID = sh2.SigHistUID 
INNER JOIN 
    Stackability (nolock) st2 on st2.ToSigUID = sh2.SigUID and st2.SigHistUID = sh.SigHistUID 
WHERE 
    st.SigHistUID < 1000 and 
    st.RelationType <> st2.RelationType 
ORDER BY 
    st.SigHistUID 
+0

Vielen Dank an alle. –