2025/06 14

SQL 사용 시 성능도 고려해야 하는 이유

SQL을 사용할 때, 정확한 결과를 얻기만 하면 그걸로 끝인 줄 알았다. 어떤 쿼리는 길이가 길어져서 가독성이 좋지 않다고 느끼는 날도 있었고, 체감상 실행 속도가 느리다고 느꼈던 경우도 있었지만 원하는 결과를 추출하는 데 성공했다면 크게 신경쓰지 않고 넘어갔었던 것 같다. 물론 그냥 넘어가면서도 이렇게 해도 되는 건가? 라는 의문이 들면서 찝찝했었다. 그래서 일을 쉬고 있는 동안 성능 좋은 SQL 작성 방법에 대해 공부해보기로 했다. 1. 성능이 안좋은 SQL이 미치는 영향원하는 결과 추출이라는 목적만 달성하면 되는 것 아닌가? 굳이 성능까지 고려해가면서 쿼리를 작성해야 하나? 라는 질문을 먼저 해보면서 시작해보자. 같은 결과를 만들더라도 SQL을 어떻게 작성하느냐에 따라 성능이 크게 달라질 수 있다..

DAY 30 / [solvesql] 연습문제 3개 풀기

난이도풀기문제 이름난이도 32개- 미세먼지 수치의 계절간 차이- 친구 수 집계하기 난이도 51개- 세션 유지 시간을 10분으로 재정의하기 30일동안 solvesql에 있는 모든 연습문제를 다시 풀어보았다. 예전에 풀었던 문제지만 오랜만에 다시 마주하니 생각보다 어려웠던 것들도 있어서 공부가 많이 되었다. 복습을 잘하자. 화이팅

DAY 29 / [solvesql] 연습문제 3개 풀기

난이도풀기문제 이름난이도 31개- 전국 카페 주소 데이터 정제하기난이도 41개- 세 명이 서로 친구인 관계 찾기난이도 51개- 스테디셀러 작가 찾기 이전에 다 풀었던 문제들인데도 어려웠음. 조인을 많이 해야하는 경우나 연속인 데이터를 찾는 경우 어떤 순서대로 작성해야할지 미리 그려보면서 하기! [복습 노트]전국 카페 주소 데이터 정제하기https://limhm4907.tistory.com/259 DAY 9 / [solvesql] Advent of SQL 2024 2문제 (전국 카페 주소 데이터 정제하기, 미세먼지 수치의 계절간 차전국 카페 주소 데이터 정제하기SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(address, ' ', 2), ' ', 1) AS sido , SUBSTR..

DAY 28 / [solvesql] 연습문제 3개 풀기

난이도풀기문제 이름난이도 31개- 멀티 플랫폼 게임 찾기 난이도 41개- 유량(Flow)와 저량(Stock) 난이도 51개- 일일 주문량의 중앙값 찾기 일일 주문량의 중앙값 찾기-- 2019년 1월 한 달 동안 일일 주문량의 중앙값을 구하는 쿼리-- 단, ‘C’로 시작하는 환불 거래는 계산에서 제외WITH base AS ( SELECT order_date , COUNT(DISTINCT order_id) AS cnt_orders FROM orders WHERE order_date BETWEEN '2019-01-01' AND '2019-01-31' AND order_id NOT LIKE 'C%' GROUP BY order_date)SELECT AVG(cnt_orders) AS med..

DAY 27 / [solvesql] 연습문제 3개 풀기

난이도풀기문제 이름난이도 31개- 폐쇄할 따릉이 정류소 찾기 2난이도 41개- 펭귄 날개와 몸무게의 상관 계수난이도 51개- 연속으로 5일 이상 미세먼지가 증가한 구간 찾기 연속으로 5일 이상 미세먼지가 증가한 구간 찾기작성 순서1. 윈도우 함수 LAG() 을 이용하여 전날의 pm10 농도를 가져오는 컬럼 생성한다.2. CASE 식을 이용하여 아래 두 경우에 해당하는 경우 날짜(measured_at)를 반환하고 그 외의 경우 NULL이 반환하여 "시작하는 날짜(start_date)"를 정의한다.-- (1) 전날의 pm10 농도가 NULL 인 경우(데이터가 처음 기록된 날짜)-- (2) 전날의 pm10 농도가 현재의 pm10 농도보다 크거나 같을 경우3. 윈도우 함수 MAX() 를 이용하여 2번에서 정의..

DAY 26 / [solvesql] 연습문제 3개 풀기

난이도풀기문제 이름난이도 31개- 서울숲 요일별 대기오염도 계산하기난이도 41개- 전력 소비량 이동 평균 구하기난이도 51개- 어떤 컨텐츠를 보고 유입되었을까? 전력 소비량 이동 평균 구하기SELECT DATE_ADD(measured_at, INTERVAL 10 MINUTE) AS end_at , ROUND(AVG(zone_quads) OVER(ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) AS zone_quads , ROUND(AVG(zone_smir) OVER(ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) AS zone_smir , ..

DAY 25 / [solvesql] 연습문제 1개 풀기 (세션 재정의하기)

난이도풀기문제 이름난이도 30개x난이도 40개x난이도 51개- 세션 재정의하기 세션 재정의하기WITH time_tab AS ( -- (1) 이전 이벤트 발생 시각을 표시하는 컬럼 생성 SELECT user_pseudo_id , LAG(event_timestamp_kst, 1) OVER(ORDER BY event_timestamp_kst) AS prev , event_timestamp_kst FROM ga WHERE user_pseudo_id = 'S3WDQCqLpK' ), check_session AS ( -- (2) 현재 이벤트와 이전 이벤트의 발생 시각 차이가 1시간 이상인 경우 표시하는 컬럼 생성 SELECT * , ..

1 2