Frage

Ich habe eine Multi-Table-SELECT-Abfrage, die wie Spaltenwerte mit sich selbst vergleicht unter:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

Dies scheint überflüssig zu mir. Meine Frage ist, Entfernen von ihnen haben keine Auswirkungen auf die Logik / Leistung?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Dieses redundanten scheint, sein einziger Effekt ist das Entfernen Zeilen, die NULL-Werte in diesen Spalten haben. Stellen Sie sicher, dass die Spalten sind NOT NULL, bevor diese Klauseln zu entfernen.

Wenn die Spalten auf NULL festlegbare sind Sie sicher, diese Zeilen mit ersetzen können (leichter zu lesen, leichter zu pflegen):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


folgende Update Jeffreys Kommentar

Sie haben völlig Recht, ich weiß nicht, wie ich es selbst nicht sah: die Verbindung impliziert Bedingung t1.col1=t2.col1, dass nur die Zeilen mit der Join-Spalt nicht null betrachtet. Die Klauseln tx.col1=tx.col1 sind daher völlig überflüssig und sicher entfernt werden kann.

Andere Tipps

Do not entfernen Sie diese, bis Sie die Auswirkungen verstehen. Wenn, wie andere unter Hinweis darauf, sie auf der Abfrage keine Auswirkungen haben und wahrscheinlich optimierten heraus, es gibt keinen Schaden in so dass sie dort, aber es kann seinen Schaden bei der Beseitigung von ihnen.

Versuchen Sie nicht fix etwas, das bis Ihr verdammten Arbeit ist sicher, dass Sie nicht etwas anderes zu brechen.

Der Grund, warum ich erwähne dies, weil wir eine Legacy-Reporting-Anwendung geerbt, die genau dieses Konstrukt hatte, entlang der Linien von:

where id = id

Und ein vernünftiger Mensch zu sein, ditched ich es, nur um zu entdecken, dass die Datenbank-Engine die Abfrage nicht das einzige, was war.

Es ging zunächst durch einen Pre-Prozessor, der jede Spalte extrahiert, die in einer where Klausel bestanden und dafür gesorgt, sie indiziert wurden. Grundsätzlich ist eine Auto-Tuning-Datenbank.

Nun, stellen Sie sich unsere Überraschung auf der nächsten Iteration, wenn die Datenbank auf einen Bruchteil seiner früheren Geschwindigkeit verlangsamt, wenn Benutzer tun waren Ad-hoc-Abfragen auf dem id Feld: -)

Stellt sich heraus, das war eine Flickschusterei put in der vorherigen Support-Team gemeinsame Ad-hoc-Abfragen, um sicherzustellen, indizierte Spalten auch verwendet haben, obwohl keines unserer Standardabfragen tat es.

Also, ich sage nicht nicht es tut, nur was darauf hindeutet, dass es vielleicht eine gute Idee sein, zu verstehen, warum es in ersten gesetzt wurde.

  1. Ja, die Bedingungen sind offensichtlich überflüssig, da sie sind identisch!

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. Sie müssen jedoch mindestens einer von ihnen. Andernfalls müssten Sie kartesisch auf die Hände: jede Zeile von table1 wird jede Zeile in table2 verbunden werden. Wenn tabelle1 100 Zeilen hatte, und table2 hatte 1000 Zeilen, würde die resultierende Abfrage 100.000 Ergebnisse zurück.

    SELECT * FROM table1 t1,table2 t2 --warning!
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top