Aggregazione con granularità diverse

Migliorare le prestazioni delle query in PostgreSQL

Amy McCarty

Instructor

Granularità dei dati: livello di dettaglio

 

  • Rende una riga univoca
  • 1+ colonne

 

Video_Games

id game first_yr
012 Grand Theft Auto 1997
234 Legend of Zelda 1986

 

 

 

Game_Platforms

game_id platform year
234 FCDS 1986
234 GameCube 2003
234 Wii 2006
Migliorare le prestazioni delle query in PostgreSQL

Join con granularità diverse

Il record di The Legend of Zelda nella tabella Video_Games collega tutti e 3 i record nella tabella Games_Platforms.

SELECT g.id, g.game, g.first_yr
  , COUNT(p.platform) AS no_platforms
  , MAX(p.year) AS last_platform_yr
  , p.platform
FROM video_games g
INNER JOIN game_platforms p
  ON g.id = p.game_id
GROUP BY g.id, g.game, g.first_yr
, p.platform
Migliorare le prestazioni delle query in PostgreSQL

Join con granularità diverse

 

Output

id game first_yr no_platforms last_platform_yr platform
234 Legend of Zelda 1986 3 2006 FCDS
234 Legend of Zelda 1986 3 2006 GameCube
234 Legend of Zelda 1986 3 2006 Wii
Migliorare le prestazioni delle query in PostgreSQL

Impostare un cambio di granularità

 

Game_Platforms

game_id platform year
234 FCDS 1986
234 GameCube 2003
234 Wii 2006

 

Migliorare le prestazioni delle query in PostgreSQL

Impostare un cambio di granularità

SELECT game_id, platform, year
  , COUNT(platform) AS no_platforms
  , MAX(year) AS last_platform_yr
FROM game_platforms
GROUP BY game_id, platform, year

Output

game_id platform year no_platforms last_platform_yr
234 FCDS 1986 3 2006
234 GameCube 2003 3 2006
234 Wii 2006 3 2006
Migliorare le prestazioni delle query in PostgreSQL

Rivediamo le CTE

  • Query autonoma con risultati temporanei
  • Istruzione WITH
WITH cte AS
  ( SELECT * FROM tableA )

SELECT * FROM cte
  • Consente di aggregare prima del join
Migliorare le prestazioni delle query in PostgreSQL

CTE in soccorso

WITH platforms_cte AS 
(  SELECT game_id, platform, year
      , COUNT(platform) AS no_platforms
      , MAX(year) AS last_platform_yr
   FROM game_platforms
   GROUP BY game_id, platform, year )
SELECT g.id, g.game, cte.no_platforms
  , cte.platform AS last_platform
FROM video_games g
INNER JOIN platforms_cte cte 
  ON g.id = cte.game_id
  AND cte.last_platform_yr = cte.year
Migliorare le prestazioni delle query in PostgreSQL

CTE in soccorso

WITH platforms_cte AS 
(  SELECT game_id, platform, year
      , COUNT(platform) AS no_platforms
      , MAX(year) AS last_platform_yr
   FROM game_platforms
   GROUP BY game_id, platform, year )
SELECT g.id, g.game, cte.no_platforms
  , cte.platform AS last_platform
FROM video_games g
INNER JOIN platforms_cte cte 
  ON g.id = cte.game_id
  AND cte.last_platform_yr = cte.year

Output

id game no_platforms last_platform
234 Legend of Zelda 3 Wii
Migliorare le prestazioni delle query in PostgreSQL

Allineare la granularità dei dati nei join

 

  • Niente ripetizioni o duplicati
  • Solo i risultati minimi necessari
  • Niente doppio conteggio
Migliorare le prestazioni delle query in PostgreSQL

Ayo berlatih!

Migliorare le prestazioni delle query in PostgreSQL

Preparing Video For Download...