Posted in mysql

MySQL Derived Table, Correlated Query



Comment

Correlated vs Non-Correlated

아래는 Non-Correlated 쿼리다. 즉 내부(Inner) 쿼리가 외부(Outer) 쿼리를 참조하지 않는다.

SELECT name  
FROM city  
WHERE population > (SELECT population  
                    FROM city
                    WHERE name = 'new york');

반면 아래는 Correlated 쿼리다. 내부 쿼리가 co.code 로 외부 쿼리를 참조한다.

SELECT name  
FROM country as co  
WHERE EXISTS (SELECT *  
              FROM city
              WHERE population > 900 AND co.code = country_code);

Correlated Query 는 이렇게 외부 쿼리에 대한 참조를 가지고 있기 때문에 외부 쿼리의 각 Row 마다 서브쿼리가 실행되고, 결국 성능은 떨어진다. 다시 말해 일반적인 서브 쿼리(Non-Correlated) 라면 N + M 번 만큼 연산을 수행하지만, Correlated 서브쿼리라면 N x M 만큼의 연산을 수행한다.

이런 Correlated QueryJoin 구문을 이용한 쿼리로 변경할 수 있다.

SELECT DISTINCT country.name  
FROM country  
JOIN city ON country.code = city.country_code  
WHERE city.population > 900;  

Derived Table

이런 성능 저하 때문에 일반적으로는 Correlated Subquery 대신에 Derived Table 을 사용한다. FROM 혹은 JOIN 구문에서 사용하는 서브쿼리를 Derived Table 이라 부른다. 본질적으로 Derived Table 은 실제 존재하는 테이블이 아니라, 쿼리 내에서만 존재하는 Inline View 다.

SELECT LastName, FirstName  
FROM  
    (SELECT * FROM Employee
     WHERE State = "NY") AS EmployeeDerivedTable
WHERE LastName = "Smith"  
ORDER BY FirstName  

References

  1. Example of bad queries

  2. Derived Table vs Subquery

  3. Difference between subquery and correlated subquery

Author

1ambda

Lisp, Emacs, FP