2016-05-13 2 views
0

Also zum Anfang werde ich sagen, dass ich für eine Firma arbeite, die gerne (und mit gutem Grund) Mikro optimieren möchte. Was ich herausfinden muss, ist, ob es eine Leistungssteigerung/-verringerung bei der Verwendung von 2 Joins gibt, oder 1 Join mit einem OR darauf.SQL-Verknüpfungen ... Mehrere oder ODER?

Dies ist kein perfektes Beispiel, aber es sollte den Punkt herüber bekommen. So zum Beispiel Sie diese 3-Tabellen haben:

dbo.CUSTOMER1 
- CustomerId 
- CustomerName 

dbo.CUSTOMER2 
- CustomerId 
- CustomerFauxId 
- CustomerName 

dbo.CUSTOMERINFO 
- CustomerId 
- CustomerData 

Nun müssen Sie die Tabellen verknüpfen und sehen, ob sie Daten entweder in der Tabelle haben. Welche Methode wird von einem Leistungsstandpunkt aus besser sein, oder gibt es sogar einen Unterschied in den beiden?

Dieses erste Beispiel ist, wie die Abfrage derzeit geschrieben wird ... Scheint mir verschwenderisch.

SELECT c1.CustomerId 

FROM dbo.CUSTOMER1 c1 

JOIN dbo.CUSTOMER2 c2 
ON c1.CustomerId = c2.CustomerId 

JOIN dbo.CUSTOMERINFO ci 
ON ci.CustomerId = c1.CustomerId; 

JOIN dbo.CUSTOMERINFO ci1 
ON ci2.CustomerId = c2.CustomerFauxId; 

Suche nach etwas in diese Richtung zu aktualisieren ...

SELECT c1.CustomerId 

FROM dbo.CUSTOMER1 c1 

JOIN dbo.CUSTOMER2 c2 
ON c1.CustomerId = c2.CustomerId 

JOIN dbo.CUSTOMERINFO ci 
ON ci.CustomerId = c1.CustomerId 
    OR ci.CustomerId = c2.CustomerFauxId; 
+4

Sie sind nicht "beitreten" die Tabellen überhaupt. Siehst du das? Die 'Join'-Bedingung fehlt. –

+0

I.e. Ein Cross-Join wird durchgeführt. – jarlh

+0

@vkp Sie haben Recht. Ich habe mich mit etwas anderem beschäftigt, als ich das geschrieben habe. Dumm dumm. Überprüfen Sie noch einmal, bitte. – Volearix

Antwort

2

Sie können Abfrageausführungsplan-Funktion in SQL Server verwenden, um die Leistung Details der Anfrage zu erhalten.

0

Die einzige logische Abfrage, die ich denken kann, ist:

SELECT * 
FROM dbo.CUSTOMER c JOIN 
    dbo.CUSTOMERINFO ci 
    ON c.CustomerId = Ci.CustomerId 
WHERE c.CustomerId IN (@Customer1, @Customer2); 

Mit Indizes auf CustomerId in beiden Tabellen, es ist schwer für mich an einer leistungsfähigere Version zu denken.

Wenn Sie die Daten für die zwei Kunden in zusätzlichen Spalten möchten, dann würden Sie die Zwei-JOIN-Version betrachten.

1

Sie geben das gleiche Ergebnis an erster Stelle nicht zurück. Im ersten Fall geben Sie Kunden zurück, in denen CustomerFauxId und CustomerId in CUSTOMERINFO Tabelle vorhanden sind. Im zweiten Fall geben Sie Kunden zurück, bei denen CustomerFauxId oder CustomerId vorhanden sind. Sie können den gleichen Kunden zweimal erhalten, wenn beide vorhanden sind.

Es ist auch etwas faul über die Tatsache, dass Sie CUSTOMER1 und CUSTOMER2 auf Primärschlüssel beitreten. Es ist schwer, ohne eine breitere Sichtweise zu sagen, aber ich würde empfehlen, sich auf das Schemadesign und die korrekte Indizierung zu konzentrieren, bevor irgendwelche Mikrooptimierungen durchgeführt werden.