2016-07-28 2 views
0

Ich habe eine SQL-Abfrage, die die Klausel existiert enthält. Zuvor gab es eine innere Verbindung zwischen zwei Tabellen, aber aufgrund einer neuen Bedingung ersetze ich Inner Join mit der exists-Klausel. Im Folgenden finden Sie meine Frage -Wie wird die Optimierung mit der Klausel sql server exists durchgeführt?

SELECT id, 
     Count(id) AS 'ItemCount' 
FROM table1 t1 
WHERE (EXISTS(SELECT DISTINCT messageid 
       FROM table2 t2 
       WHERE t2.messageid = t1.chatmessageid 
         AND t2.receiverid = 'xyzo-1234' 
         AND t2.groupid = 'wxfx-1234' 
         AND (t1.userid = 'ttew-3457' 
           OR t1.userid IS NULL)) 
      OR (t1.userid = 'ttew-3457')) 
     AND (t1.machineid != 'C34F-A609') 
     AND (t1.createdtime > '2016-07-20 :: 07:21:51.9118534') 
     AND (t1.createdtime <= '2016-07-27 :: 13:25:30.1016155') 
     AND (t1.groupid = 'wxfx-1234') 
GROUP BY t1.id 
ORDER BY t1.id 

Aber diese Abfrage etwas mehr Zeit als die vorherige Abfrage nimmt und ich mag es mehr optimieren. Kann mir jemand vorschlagen, wie ich diese Abfrage optimieren kann?

+5

Nun, für Anfänger ist 'DISTINCT' sinnlos innerhalb eines' EXISTS', da es nur auf die Unterscheidung zwischen 0 Zeilen und mehr als 0 Zeilen ankommt. –

+0

'EXISTS (... ODER t1.UserId ist NULL' - bist du sicher? –

+0

Wenn Sie Spalten haben, die NULL-Wert haben können, schreiben Sie mit so etwas wie 'isnull (t1.UserId,' ')' – xdd

Antwort

0
SELECT Id, COUNT(Id) as 'ItemCount' 
FROM table1 t1 WHERE (
        EXISTS( 
          ***SELECT Count 1 0 FROM table2 t2*** 
          WHERE t2.MessageId = t1.ChatMessageId AND t2.ReceiverId ='xyzo-1234' 
          AND t2.GroupId='wxfx-1234' 
          AND (t1.UserId ='ttew-3457' OR t1.UserId IS NULL) 
          ) 
       OR (t1.UserId ='ttew-3457') 
      ) 
     AND (t1.MachineId != 'C34F-A609') AND (t1.CreatedTime > '2016-07-20 :: 07:21:51.9118534') 
     AND (t1.CreatedTime <= '2016-07-27 :: 13:25:30.1016155') AND (t1.GroupId='wxfx-1234') 
GROUP BY t1.Id 
ORDER BY t1.Id 
+0

Bitte verwenden Sie die Codeformatierung :) –