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











댓글

이 블로그의 인기 게시물

데이터 크롤링(3주차)

SQL(8)(writing subqueries, window functions)