2017-06-16 2 views
1

Ich habe 2 SQL-Abfragen, die die gleiche Sache, erste Abfrage dauert 13 Sekunden, um auszuführen, während zweite dauert 1 Sekunde, um auszuführen. Irgendein Grund warum?SQL join läuft langsam

nicht notwendig, alle IDs in Process werden Daten in ProcessMessageDetails haben

- dauert 13 sec

Select * from dbo.ProcessMessages t1 
    join dbo.ProcessMessageDetails t2 on t1.ProcessMessageId = t2.ProcessMessageId 
    Where Id = 4 and Isdone = 0 

--takes unter einer Sekunde auszuführen

Select * from dbo.ProcessMessageDetails 
    where ProcessMessageId in (Select distinct ProcessMessageId from dbo.ProcessMessages t1 
    Where Where Id = 4 and Isdone = 0) 

I auszuführen Clustered Index auf t1.processMessageId (Pk) und nicht Clustered Index auf t2.processMessageId (FK)

+0

von welchen Tabellen werden id und isdone bezogen? Nebenbei bemerkt, in der ersten Version wird ein 1-M-Join aufgelöst, während im zweiten Schritt die Engine nicht an den Tischen teilnehmen muss. – xQbert

+0

ID und Isdone stammen aus dbo.ProcessMessages t1. Ich habe einen nicht gruppierten Index für Id und IsDone erstellt – user1005310

+1

Können Sie einen Ausführungsplan hinzufügen? – Naruto

Antwort

1

Ich würde die tatsächlichen Ausführungspläne benötigen, um Ihnen genau zu sagen, was SqlServer hinter den Kulissen tut. Ich kann Ihnen sagen, dass diese Abfragen nicht genau dasselbe tun.

Die erste Abfrage durchläuft und findet alle Elemente, die die Bedingungen für t1 erfüllen und alle Elemente für t2 finden und dann herausfinden, welche übereinstimmen und sie zusammenfügen.

Der zweite sagt, zuerst alle Elemente finden, die meine Kriterien aus t1 erfüllen, und dann die Elemente in t2 finden, die eine dieser IDs haben.

Abhängig von Ihren Statistiken, verfügbaren Indizes, Hardware, Tabellengrößen: Sql Server entscheidet sich möglicherweise für verschiedene Arten von Scans oder versucht Daten für jeden Teil der Abfrage auszuwählen, und kann auch entscheiden, Daten in einem zusammenzufügen bestimmte Weise.