News:
SQL Tuning Tipp: ANY- und ALL- Operator

Relativ wenig bekannt und daher selten benutzt sind die Vergleichsoperatoren ANY und ALL. Sie agieren in der Regel jedoch wesentlich performanter als adäquate Formulierungen mit Subqueries.

Icon Unternehmen

Der Performancegewinn ist bei ALL nicht so erheblich, weil hier ähnlich der adäquaten Formulierung (max() in Subquery) ein Maximum ermittelt werden muss. Deutlicher zum Tragen kommt der Vorteil beim ANY-Operator, da hier im Gegensatz zum adäquaten min() von einem Abbruchkriterium profitiert werden kann.

In beiden Fällen ist jedoch die Cardinality-Schätzung bei Verwendung von ANY / ALL besser als bei der Verwendung von Aggregaten in den Subqueries, da hier wiederum der Fakt greift, dass Statistiken auf Funktionswerten nicht per se vorhanden sind. Je exakter die Cardinality-Schätzung ist, desto besser können auf dieser Query aufbauende weitere Schritte bewertet werden.

Beispiel ohne ANY-Operator (Mitarbeiter in München, die mehr verdienen als irgendein Mitarbeiter in Seattle)

SELECT first_name, last_name, salary
FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
WHERE city='Munich'
AND salary > (
  SELECT min(salary)
  FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
  WHERE city='Seattle');

Adäquates Beispiel mit ANY-Operator

SELECT first_name, last_name, salary
FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
WHERE city='Munich'
AND salary > ANY (
  SELECT salary
  FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
  WHERE city='Seattle');

Beispiel ohne ALL-Operator (Mitarbeiter in München, die mehr verdienen als alle Mitarbeiter in Seattle)

SELECT first_name, last_name, salary
FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
WHERE city='Munich'
AND salary > (
  SELECT max(salary)
  FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
  WHERE city='Seattle');

Adäquates Beispiel mit ALL-Operator

SELECT first_name, last_name, salary
FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
WHERE city='Munich'
AND salary > ALL (
  SELECT salary
  FROM employees JOIN departments using (department_id) JOIN locations using (location_id)
  WHERE city='Seattle');