2009-08-13 3 views
0

Ich habe 2 Tabellen, OrderData und StagingOrderData. Ich muss sehen, ob es Zeilen in den StagingOrderData gibt, die in der OrderData vorhanden sind, so dass ich sie vor dem Import aus der StagingOrderData-Tabelle löschen kann.Welche SQL-Anweisung ist effizienter Joins oder existiert

Testfälle - Ich habe versucht, ein

beitreten
select * from 
dbo.stagingOrderData s 
inner join dbo.OrderData o 
on s.productid = o.productid 
and s.barcode = o.barcode 
and s.orderid = o.orderid 

und dann und „existiert“

select * from 
dbo.stagingOrderData s 
where exists(dbo.OrderData o 
select * from 
    where o.productid = s.productid 
and o.barcode = s.barcode 
and o.orderid = s.orderid) 

Die Aussage mit dem „existiert“ scheint viel schneller zu sein.

+1

Duplizieren - siehe diese Frage hier zum Beispiel: http://stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-or-using-exists –

Antwort

1

Meine Erfahrung ist, dass es ein Toss-Up ist. Wenn Sie eine gute Indizierung für die beiden Tabellen haben (Sie benötigen einen Index mit productid, barcode und orderid), wette ich, dass diese beiden Abfragen ungefähr gleich sind. Also würde ich das verwenden, was Sie für leichter halten/lesen.

Plus, wenn alles, was Sie tun, Abfragen ist, um festzustellen, ob Sie löschen müssen, können Sie besser die Auswahl überspringen und nur das Löschen tun. Wenn es nichts zu löschen gibt, wird die delete-Anweisung dies erkennen und nichts tun. Mit anderen Worten, Sie müssen die Daten zweimal verarbeiten, wenn Sie feststellen, dass etwas gelöscht werden muss. Stattdessen tun Sie nur das Löschen und Sie werden nur einmal die Daten verarbeiten, egal was passiert.

1

Ein exists wird in der Regel schneller sein. Es stoppt nach dem Finden der ersten Übereinstimmung nach allem, wo die Verbindung alle möglichen Übereinstimmungen berücksichtigen muss.

Sie möchten vielleicht fragen, ob Sie es auf diese Weise überhaupt tun müssen. Anstatt die Zeilen zu löschen, ist es besser, wenn Sie die Einfügung mit der Einschränkung "where not exists ..." ausführen. Wenn Sie SQL Server 2008 verwenden, können Sie mit einer Zusammenführungsanweisung noch besser vorgehen.

Verwandte Themen