5월 식품들의 총매출 조회하기

2026. 3. 3. 21:22ㆍ프로그래머스:sql 고득점 Kit

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131117

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

유튜브: https://youtu.be/4MaFGuxGQkg

 


나의 정답

WITH X AS(
    SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT FROM FOOD_ORDER
    WHERE MONTH(PRODUCE_DATE) =5
    GROUP BY PRODUCT_ID

)
SELECT PRODUCT_ID, PRODUCT_NAME, (PRICE * AMOUNT) AS TOTAL_SALES 
FROM FOOD_PRODUCT AS P INNER JOIN X USING(PRODUCT_ID)
ORDER BY (PRICE * AMOUNT) DESC, PRODUCT_ID

WHERE MONTH(PRODUCE_DATE) = 5 조건은 PRODUCE_DATE 컬럼 자체를 MONTH() 함수로 감싸서 가공하고 있습니다. 이렇게 조건절에서 탐색 대상 컬럼을 함수로 변형하게 되면, 데이터베이스는 해당 컬럼에 설정된 인덱스를 제대로 타지 못하고 테이블 전체를 스캔해야 하는 상황이 발생할 수 있습니다.

 

Q&A

질문

해당 컬럼이 어디에서 온건지 표기하면 쿼리의 실행 속도가 더 빨라지나?

 

답변
SQL에서 테이블 별칭(alias)을 명시한다고 해서 쿼리 실행 속도가 더 빨라지지는 않습니다! 🚀

PRICE가 FOOD_PRODUCT 테이블에만 있는 컬럼이라면, P.PRICE라고 적든 그냥 PRICE라고 적든 데이터베이스 엔진은 어느 테이블에서 가져와야 할지 이미 알고 있습니다.

 

컬럼의 출처를 밝히는 것은 데이터베이스의 속도를 위해서가 아니라, 쿼리를 읽는 사람👀이 헷갈리지 않게 하기 위해 작성하는 좋은 습관에 가깝습니다.


질문
함수를 사용하면 인덱스를 못 사용하는거야?
원본 테이블을 읽어오는거면 인덱스를 사용 가능한거고?

 

답변
조건절에서 컬럼을 함수로 가공하면 인덱스를 사용할 수 없는 경우가 많습니다.

💡 인덱스는 테이블의 원본 데이터를 기준으로 정렬되어 저장되는데, 컬럼에 함수를 씌워 값을 변형해 버리면 데이터베이스는 기존에 정리된 인덱스를 찾지 못하고 모든 행을 다 확인(풀 테이블 스캔)해야 하기 때문입니다.


질문
WHERE PRODUCE_DATE LIKE '2022-05%' 하면 더 빠른가?

 

답변
만약 날짜형 컬럼에 LIKE를 쓰게 되면, 데이터베이스는 비교를 위해 날짜 데이터를 몰래 문자열로 바꾸는 작업(암시적 형변환)을 거치게 됩니다. 이는 아까 컬럼에 함수를 씌웠을 때 원본 데이터가 변형되어 인덱스를 제대로 타지 못했던 것과 비슷한 상황을 만들 수 있습니다


더 나은 정답

WITH X AS(
    SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT FROM FOOD_ORDER
    WHERE PRODUCE_DATE BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59' 
    # WHERE PRODUCE_DATE >= '2022-05-01' AND PRODUCE_DATE < '2022-06-01'
    GROUP BY PRODUCT_ID

)
SELECT PRODUCT_ID, PRODUCT_NAME, (PRICE * AMOUNT) AS TOTAL_SALES 
FROM FOOD_PRODUCT AS P INNER JOIN X USING(PRODUCT_ID)
ORDER BY (PRICE * AMOUNT) DESC, PRODUCT_ID

 

 

 

 

 

 


 

반응형