Der heutige SQL Tuning Tipp beschäftigt sich mit den Operatoren ANY und ALL und deren Auswirkungen auf das Thema Performance.
ALL vs. ANY
Der Performancegewinn ist bei ALL nicht wirklich 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');
Share this article