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 Query 는 Join 구문을 이용한 쿼리로 변경할 수 있다.
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