Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL은 SELECT와 GROUP BY/HAVING 절 사이의 공통 하위 표현식을 제거할까? sleep() 함수로 테스트하는 방법

MySQL에서 SELECT 절과 GROUP BY 또는 HAVING 절에 동일한 표현식을 사용했을 때, 옵티마이저가 이를 한 번만 계산하고 재사용하는지(공통 하위 표현식 제거) 궁금하다면 sleep() 함수를 활용해 직접 테스트해볼 수 있습니다. sleep()는 지정한 시간(초)만큼 실행을 지연시키므로, 표현식이 몇 번 평가되는지 실행 시간으로 확인할 수 있습니다.

테스트용 쿼리 문법

Case 1 − GROUP BY에 동일한 표현식을 그대로 사용

SELECT yourColumnName+sleep(yourIntegerValue)
FROM yourTableName
GROUP BY yourColumnName+sleep(yourIntegerValue);

Case 2 − 별칭(alias)을 사용하는 문법

다음과 같이 별칭을 지정한 뒤 GROUP BY에서 해당 별칭을 참조하는 방식도 사용할 수 있습니다.

SELECT yourColumnName+sleep(yourIntegerValue) As anyAliasName
FROM yourTableName
GROUP BY yourAliasName;

테스트 테이블 생성 및 데이터 준비

위 문법들을 실제로 확인하기 위해 먼저 테이블을 생성합니다.

mysql> create table sleepDemo
    -> (
    -> value int
    -> );
Query OK, 0 rows affected (1.25 sec)

insert 명령으로 몇 개의 레코드를 삽입합니다.

mysql> insert into sleepDemo values(40);
Query OK, 1 row affected (0.18 sec)
mysql> insert into sleepDemo values(60);
Query OK, 1 row affected (0.19 sec)
mysql> insert into sleepDemo values(60);
Query OK, 1 row affected (0.10 sec)

select 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from sleepDemo;

실행 결과는 다음과 같습니다.

+-------+
| value |
+-------+
| 40    |
| 60    |
| 60    |
+-------+
3 rows in set (0.00 sec)

SELECT와 GROUP BY/HAVING 절 간 공통 하위 표현식 제거 여부 확인

Case 1 − 동일한 표현식을 반복해서 사용한 경우

mysql> SELECT value+sleep(3)
   -> FROM sleepDemo
   -> GROUP BY value+sleep(3);

실행 결과는 다음과 같습니다.

+----------------+
| value+sleep(3) |
+----------------+
| 40             |
| 60             |
+----------------+
2 rows in set (9.00 sec)

쿼리 실행에 총 9초가 소요되었습니다. 즉, 값 40에 3초, 값 60 두 행에 각각 3초씩 할당되어 행마다 sleep(3)이 개별적으로 실행된 것입니다. 이를 통해 SELECT 절과 GROUP BY 절의 표현식이 각각 독립적으로 평가되었음을 짐작할 수 있습니다.

Case 2 − 별칭을 사용한 경우

mysql> SELECT value+sleep(3) As v
   -> FROM sleepDemo
   -> GROUP BY v;

실행 결과는 다음과 같습니다.

+------+
| v    |
+------+
| 40   |
| 60   |
+------+
2 rows in set (9.00 sec)

별칭을 사용한 Case 2 역시 동일하게 9초가 걸렸습니다. 이처럼 sleep() 함수의 지연 시간을 측정하면, 동일한 표현식이 SELECT 절과 GROUP BY/HAVING 절에서 각각 몇 번 평가되는지 명확하게 파악할 수 있으며, MySQL이 두 절 사이의 공통 하위 표현식을 자동으로 제거하지 않는다는 사실을 실험적으로 확인할 수 있습니다.