SQL(9)(performance tuning queries, pivoting data)
PERFORMANCE TUNING QUERIES
쿼리를 개선할 수 있는 개선방법을 식별하는 방법
먼저 수행해야하는 계산 수와 쿼리 런타임에 영향을 주는 몇가지 사항
- 테이블 크기 : 쿼리가 수백만개의 행이 있는 하나 이상의 테이블에 도달하면 성능에 영향을 미칠 수 있다.
- 조인 : 쿼리가 결과 집합의 행 수를 크게 늘리는 방식으로 두 테이블을 조인하면 쿼리가 느려질 수 있다.
- 집계 : 결과를 생성하기 위해 여러 행을 결합하려면 단순히 해당 행을 검색하는 것보다 더 많은 계산이 필요하다.
- 쿼리를 실행하는 다른 사용자 : 데이터베이스에서 동시에 실행되는 쿼리가 많을수록 데이터베이스가 주어진 시간에 더 많은 처리해야하며 모든것이 느리게 실행된다.
- 데이터베이스 소프트웨어 및 최적화 : 제어 할 수 없는 부분이지만 사용중인 시스템을 알고있다면 범위 내에서 작업하면 쿼리를 보다 효율적으로 만들 수 있다.
테이블 크기 줄이기
1 2 3 4 | SELECT * FROM benn.sample_event_table WHERE event_date >= '2014-03-01' AND event_date < '2014-04-01' | cs |
1 2 3 | SELECT COUNT(*) FROM benn.sample_event_table LIMIT 100 | cs |
1 2 3 4 5 6 | SELECT COUNT(*) FROM ( SELECT * FROM benn.sample_event_table LIMIT 100 ) sub | cs |
조인을 덜 복잡하게 만들기
1 2 3 4 5 6 7 | SELECT teams.conference AS conference, players.school_name, COUNT(1) AS players FROM benn.college_football_players players JOIN benn.college_football_teams teams ON teams.school_name = players.school_name GROUP BY 1,2 | cs |
1 2 3 4 | SELECT players.school_name, COUNT(*) AS players FROM benn.college_football_players players GROUP BY 1 | cs |
위 쿼리는 252개의 결과를 반환한다. 하위 쿼리에서 이를 삭제한 다음 외부 쿼리에서 조인하면 조인비용을 크게 줄일 수 있다.
1 2 3 4 5 6 7 8 9 10 | SELECT teams.conference, sub.* FROM ( SELECT players.school_name, COUNT(*) AS players FROM benn.college_football_players players GROUP BY 1 ) sub JOIN benn.college_football_teams teams ON teams.school_name = sub.school_name | cs |
PIVOTING DATA
분석을 위해 형식이 지정된 데이터를 가져와 프레젠테이션 또는 차트로 전환하는 방법
1 2 3 4 5 6 7 8 | SELECT teams.conference AS conference, players.year, COUNT(1) AS players FROM benn.college_football_players players JOIN benn.college_football_teams teams ON teams.school_name = players.school_name GROUP BY 1,2 ORDER BY 1,2 | cs |
매년 플레이어 수 표시
데이터를 변화하려면 위의 쿼리를 하위 쿼리에 넣어야한다.
1 2 3 4 5 6 7 8 9 10 | SELECT * FROM ( SELECT teams.conference AS conference, players.year, COUNT(1) AS players FROM benn.college_football_players players JOIN benn.college_football_teams teams ON teams.school_name = players.school_name GROUP BY 1,2 ) sub | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SELECT conference, SUM(players) AS total_players, SUM(CASE WHEN year = 'FR' THEN players ELSE NULL END) AS fr, SUM(CASE WHEN year = 'SO' THEN players ELSE NULL END) AS so, SUM(CASE WHEN year = 'JR' THEN players ELSE NULL END) AS jr, SUM(CASE WHEN year = 'SR' THEN players ELSE NULL END) AS sr FROM ( SELECT teams.conference AS conference, players.year, COUNT(1) AS players FROM benn.college_football_players players JOIN benn.college_football_teams teams ON teams.school_name = players.school_name GROUP BY 1,2 ) sub GROUP BY 1 ORDER BY 2 DESC | cs |

댓글
댓글 쓰기