dedlfix: EXISTS vs. IN

Beitrag lesen

Hi!

Da hätte ich gleich mal eine Folgefrage. Gegenüber dieser EXISTS-Variante

SELECT A.*

FROM ticket A
  WHERE NOT EXISTS (SELECT B.ticket FROM antwort B WHERE B.ticket = A.id)

  
gibt es ja auch noch die IN-Variante  
  
`SELECT * FROM ticket WHERE id NOT IN(SELECT ticket FROM antwort)`{:.language-sql}  
  
Abgesehen davon, dass die IN-Variante kürzer zu notieren ist, welche ist aus DBMS-Sicht die bessere? (Lässt sich das überhaupt so generell klären?)  
  
Meine Gedanken dazu sind: Bei der IN-Variante muss das DBMS einmalig die Ergebnismenge der Subquery ermitteln. Dabei kann es je nach Art der Daten sicherlich auch vorkommen, dass einige Werte mehrfach vorkommen. (Zusatzfrage: Lohnt sich da ein DISTINCT, um die Menge einzudampfen oder ist das nur unnötiger Aufwand?) Die A-Datensätze müssen nun gegen diese temporäre Liste geprüft werden.  
  
Die EXISTS-Variante würde für jeden A-Datensatz die Bedingung B.ticket = A.id testen, wofür sie einen Index verwenden kann, wenn einer auf B.ticket liegt. Das dürfte die weniger Speicher verbrauchende Variante sein, weil sie keine temporäre Liste erzeugen muss. Viele Plattenzugriffe dürften nicht anfallen, weil bestimmt irgendwelche Caching-Mechanismen greifen.  
  
  
Übrigens, da bei Verwendung von [EXISTS](http://dev.mysql.com/doc/refman/5.1/en/exists-and-not-exists-subqueries.html) die SELECT-Klausel der Subquery nicht ausgewertet wird, kann da auch der Kürze wegen einfach ein \* stehen. Macht vermutlich jedes DBMS so.  
  
  
Lo!