News zu Oracle

SQL Tuning Tipp: ANY- und ALL- Operator

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 profi­tiert 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');
Hier findest du weitere Posts zu den Themen SQL Tuning bzw. Performance Tuning aus unserem News Bereich. 
icon-arrow_right_medium-violet-blue.svg

Share this article

Share on facebook
Facebook 
Share on twitter
Twitter 
Share on linkedin
LinkedIn 
Share on xing
XING 
Share on whatsapp
WhatsApp 
Share on email
Email