Queryprestaties verbeteren in PostgreSQL
Amy McCarty
Instructor
-- SUBQUERY
SELECT COUNT(athlete_id)
FROM athletes
WHERE country IN
(SELECT country FROM climate
WHERE temp_annual > 22)
-- JOIN
SELECT COUNT(athlete_id)
FROM athletes a
INNER JOIN climate c
ON a.country = c.country
AND c.temp_annual > 22
Aggregate ()
-> Hash Join ()
Hash Cond: (athletes.country = climate.country)
-> Seq Scan on athletes ()
-> Hash ()
-> Seq Scan on climate ()
Filter: (temp_annual > '22'::numeric)
-- CTE
WITH celsius AS
(
SELECT country
FROM climate
WHERE temp_annual > 22 -- Celsius
)
SELECT count(athlete_id)
FROM athletes a
INNER JOIN celsius c
ON a.country = c.country
-- TEMP TABLE
CREATE TEMPORARY TABLE celsius AS
SELECT country
FROM climate
WHERE temp_annual > 22; -- Celsius
SELECT count(athlete_id)
FROM athletes a
INNER JOIN celsius c
ON a.country = c.country
Aggregate ()
CTE celsius
-> Seq Scan on climate ()
Filter: (temp_annual > '22'::numeric)
-> Hash Join ()
Hash Cond: (a.country_code = c.country_code)
-> Seq Scan on athletes a ()
-> Hash ()
-> CTE Scan on celsius c ()
SELECT country_code
, COUNT(athlete_id) as athletes
FROM athletes
WHERE year in (2014, 2010) -- Indexed column
GROUP BY country_code
SELECT country_code
, COUNT(athlete_id) as athletes
FROM athletes
WHERE year in (2014, 2010) -- Indexed column
GROUP BY country_code
| Geen index | Index |
|---|---|
| Planningstijd: 3,370 ms | Planningstijd: 0,163 ms |
| Uitvoeringstijd: 0,143 ms | Uitvoeringstijd: 0,062 ms |
SELECT r.country
, COUNT(a.athlete_id) as athletes
FROM regions r -- country level
INNER JOIN athletes a -- athletes level
ON r.country = a.country
GROUP BY r.country
WITH olympians AS ( -- country level
SELECT country
, COUNT(athlete_id) as athletes
FROM athletes -- athletes level
GROUP BY country
)
SELECT country, athletes
FROM regions r -- country level
INNER JOIN olympians o
ON r.country = o.country
| Uitvoeringstijd | |
|---|---|
| Eerst join | 0,267 ms |
| Eerst aggregeren | 0,192 ms |
Queryprestaties verbeteren in PostgreSQL