Last active
April 12, 2017 14:34
-
-
Save just3ws/3e940ae77705521721b9b43978c24caa to your computer and use it in GitHub Desktop.
Refactoring Postgres Queries
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
explain (analyze on, buffers on, verbose on, timing on) | |
select l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
from simulation_results l | |
inner join ( | |
select simulation_id, max(created_at) created_at | |
from simulation_results | |
where user_id = 827911 | |
group by simulation_id | |
) r | |
on l.simulation_id = r.simulation_id and l.created_at = r.created_at | |
where l.user_id = 827911; | |
QUERY PLAN | |
--------------------------------------------------------------------------------------------------------------------------------------------------- | |
Unique (cost=1.30..1.32 rows=1 width=52) (actual time=0.045..0.063 rows=3 loops=1) | |
Output: (max(created_at) OVER (?)), id, simulation_id, user_id, content_package_id, score, result, total_time_taken, updated_at, created_at | |
Buffers: shared hit=1 | |
-> WindowAgg (cost=1.30..1.32 rows=1 width=52) (actual time=0.044..0.058 rows=23 loops=1) | |
Output: max(created_at) OVER (?), id, simulation_id, user_id, content_package_id, score, result, total_time_taken, updated_at, created_at | |
Buffers: shared hit=1 | |
-> Sort (cost=1.30..1.30 rows=1 width=44) (actual time=0.040..0.043 rows=23 loops=1) | |
Output: simulation_id, created_at, id, user_id, content_package_id, score, result, total_time_taken, updated_at | |
Sort Key: simulation_results.simulation_id, simulation_results.created_at DESC | |
Sort Method: quicksort Memory: 26kB | |
Buffers: shared hit=1 | |
-> Seq Scan on public.simulation_results (cost=0.00..1.29 rows=1 width=44) (actual time=0.013..0.024 rows=23 loops=1) | |
Output: simulation_id, created_at, id, user_id, content_package_id, score, result, total_time_taken, updated_at | |
Filter: (simulation_results.user_id = 827911) | |
Buffers: shared hit=1 | |
Planning time: 0.096 ms | |
Execution time: 0.092 ms | |
(17 rows) | |
-- | |
explain (analyze on, buffers on, verbose on, timing on) | |
select l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
from simulation_results l | |
inner join ( | |
select simulation_id, max(created_at) created_at | |
from simulation_results | |
where user_id = 827911 | |
group by simulation_id | |
) r | |
using (simulation_id, created_at) | |
where l.user_id = 827911; | |
QUERY PLAN | |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
Nested Loop (cost=1.29..2.62 rows=1 width=44) (actual time=0.048..0.052 rows=3 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Join Filter: ((l.simulation_id = simulation_results.simulation_id) AND (l.created_at = (max(simulation_results.created_at)))) | |
Rows Removed by Join Filter: 66 | |
Buffers: shared hit=2 | |
-> Seq Scan on public.simulation_results l (cost=0.00..1.29 rows=1 width=44) (actual time=0.009..0.013 rows=23 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Filter: (l.user_id = 827911) | |
Buffers: shared hit=1 | |
-> HashAggregate (cost=1.29..1.30 rows=1 width=12) (actual time=0.001..0.001 rows=3 loops=23) | |
Output: simulation_results.simulation_id, max(simulation_results.created_at) | |
Group Key: simulation_results.simulation_id | |
Buffers: shared hit=1 | |
-> Seq Scan on public.simulation_results (cost=0.00..1.29 rows=1 width=12) (actual time=0.002..0.006 rows=23 loops=1) | |
Output: simulation_results.id, simulation_results.simulation_id, simulation_results.user_id, simulation_results.content_package_id, simulation_results.score, simulation_results.result, simulation_results.total_time_taken, simulation_results.created_at, simulation_results.updated_at | |
Filter: (simulation_results.user_id = 827911) | |
Buffers: shared hit=1 | |
Planning time: 1.797 ms | |
Execution time: 0.086 ms | |
(19 rows) | |
-- | |
explain (analyze on, buffers on, verbose on, timing on) | |
select l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
from simulation_results l | |
inner join ( | |
select | |
simulation_id, | |
max(created_at) over (partition by simulation_id) created_at | |
from simulation_results | |
where user_id = 827911 | |
group by simulation_id, created_at | |
) r | |
using (simulation_id, created_at) | |
where l.user_id = 827911; | |
QUERY PLAN | |
--------------------------------------------------------------------------------------------------------------------------------------------- | |
Nested Loop (cost=1.30..2.63 rows=1 width=44) (actual time=0.412..0.464 rows=23 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Join Filter: ((l.simulation_id = simulation_results.simulation_id) AND (l.created_at = (max(simulation_results.created_at) OVER (?)))) | |
Rows Removed by Join Filter: 506 | |
Buffers: shared hit=2 | |
-> Seq Scan on public.simulation_results l (cost=0.00..1.29 rows=1 width=44) (actual time=0.007..0.009 rows=23 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Filter: (l.user_id = 827911) | |
Buffers: shared hit=1 | |
-> WindowAgg (cost=1.30..1.32 rows=1 width=20) (actual time=0.007..0.017 rows=23 loops=23) | |
Output: simulation_results.simulation_id, max(simulation_results.created_at) OVER (?), simulation_results.created_at | |
Buffers: shared hit=1 | |
-> Group (cost=1.30..1.31 rows=1 width=12) (actual time=0.001..0.008 rows=23 loops=23) | |
Output: simulation_results.simulation_id, simulation_results.created_at | |
Group Key: simulation_results.simulation_id, simulation_results.created_at | |
Buffers: shared hit=1 | |
-> Sort (cost=1.30..1.30 rows=1 width=12) (actual time=0.001..0.003 rows=23 loops=23) | |
Output: simulation_results.simulation_id, simulation_results.created_at | |
Sort Key: simulation_results.simulation_id, simulation_results.created_at | |
Sort Method: quicksort Memory: 26kB | |
Buffers: shared hit=1 | |
-> Seq Scan on public.simulation_results (cost=0.00..1.29 rows=1 width=12) (actual time=0.002..0.006 rows=23 loops=1) | |
Output: simulation_results.simulation_id, simulation_results.created_at | |
Filter: (simulation_results.user_id = 827911) | |
Buffers: shared hit=1 | |
Planning time: 0.179 ms | |
Execution time: 0.503 ms | |
(27 rows) | |
-- | |
explain (analyze on, buffers on, verbose on, timing on) | |
select l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
from simulation_results l | |
inner join ( | |
select simulation_id, max(created_at) created_at | |
from simulation_results | |
where user_id = 827911 | |
group by simulation_id | |
) r | |
on l.simulation_id = r.simulation_id and l.created_at = r.created_at | |
where l.user_id = 827911; | |
QUERY PLAN | |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
Nested Loop (cost=1.29..2.62 rows=1 width=44) (actual time=0.046..0.049 rows=3 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Join Filter: ((l.simulation_id = simulation_results.simulation_id) AND (l.created_at = (max(simulation_results.created_at)))) | |
Rows Removed by Join Filter: 66 | |
Buffers: shared hit=2 | |
-> Seq Scan on public.simulation_results l (cost=0.00..1.29 rows=1 width=44) (actual time=0.009..0.010 rows=23 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Filter: (l.user_id = 827911) | |
Buffers: shared hit=1 | |
-> HashAggregate (cost=1.29..1.30 rows=1 width=12) (actual time=0.001..0.001 rows=3 loops=23) | |
Output: simulation_results.simulation_id, max(simulation_results.created_at) | |
Group Key: simulation_results.simulation_id | |
Buffers: shared hit=1 | |
-> Seq Scan on public.simulation_results (cost=0.00..1.29 rows=1 width=12) (actual time=0.001..0.006 rows=23 loops=1) | |
Output: simulation_results.id, simulation_results.simulation_id, simulation_results.user_id, simulation_results.content_package_id, simulation_results.score, simulation_results.result, simulation_results.total_time_taken, simulation_results.created_at, simulation_results.updated_at | |
Filter: (simulation_results.user_id = 827911) | |
Buffers: shared hit=1 | |
Planning time: 0.159 ms | |
Execution time: 0.077 ms | |
(19 rows) | |
-- | |
explain (analyze on, buffers on, verbose on, timing on) | |
select l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
from simulation_results l | |
natural join ( | |
select simulation_id, max(created_at) created_at | |
from simulation_results | |
where user_id = 827911 | |
group by simulation_id | |
) r | |
where l.user_id = 827911; | |
QUERY PLAN | |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
Nested Loop (cost=1.29..2.62 rows=1 width=44) (actual time=0.050..0.053 rows=3 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Join Filter: ((l.simulation_id = simulation_results.simulation_id) AND (l.created_at = (max(simulation_results.created_at)))) | |
Rows Removed by Join Filter: 66 | |
Buffers: shared hit=2 | |
-> Seq Scan on public.simulation_results l (cost=0.00..1.29 rows=1 width=44) (actual time=0.010..0.014 rows=23 loops=1) | |
Output: l.id, l.simulation_id, l.user_id, l.content_package_id, l.score, l.result, l.total_time_taken, l.created_at, l.updated_at | |
Filter: (l.user_id = 827911) | |
Buffers: shared hit=1 | |
-> HashAggregate (cost=1.29..1.30 rows=1 width=12) (actual time=0.001..0.001 rows=3 loops=23) | |
Output: simulation_results.simulation_id, max(simulation_results.created_at) | |
Group Key: simulation_results.simulation_id | |
Buffers: shared hit=1 | |
-> Seq Scan on public.simulation_results (cost=0.00..1.29 rows=1 width=12) (actual time=0.001..0.005 rows=23 loops=1) | |
Output: simulation_results.id, simulation_results.simulation_id, simulation_results.user_id, simulation_results.content_package_id, simulation_results.score, simulation_results.result, simulation_results.total_time_taken, simulation_results.created_at, simulation_results.updated_at | |
Filter: (simulation_results.user_id = 827911) | |
Buffers: shared hit=1 | |
Planning time: 0.178 ms | |
Execution time: 0.098 ms | |
(19 rows) | |
-- | |
explain (analyze on, buffers on, verbose on, timing on) | |
select | |
distinct on (simulation_id, user_id) max(created_at) over (partition by simulation_id order by created_at desc) created_at, | |
id, simulation_id, user_id, content_package_id, score, result, total_time_taken, updated_at | |
from simulation_results | |
where user_id = 827911; | |
QUERY PLAN | |
--------------------------------------------------------------------------------------------------------------------------------------------------- | |
Unique (cost=1.30..1.32 rows=1 width=52) (actual time=0.032..0.050 rows=3 loops=1) | |
Output: (max(created_at) OVER (?)), id, simulation_id, user_id, content_package_id, score, result, total_time_taken, updated_at, created_at | |
Buffers: shared hit=1 | |
-> WindowAgg (cost=1.30..1.32 rows=1 width=52) (actual time=0.032..0.047 rows=23 loops=1) | |
Output: max(created_at) OVER (?), id, simulation_id, user_id, content_package_id, score, result, total_time_taken, updated_at, created_at | |
Buffers: shared hit=1 | |
-> Sort (cost=1.30..1.30 rows=1 width=44) (actual time=0.027..0.029 rows=23 loops=1) | |
Output: simulation_id, created_at, id, user_id, content_package_id, score, result, total_time_taken, updated_at | |
Sort Key: simulation_results.simulation_id, simulation_results.created_at DESC | |
Sort Method: quicksort Memory: 26kB | |
Buffers: shared hit=1 | |
-> Seq Scan on public.simulation_results (cost=0.00..1.29 rows=1 width=44) (actual time=0.009..0.013 rows=23 loops=1) | |
Output: simulation_id, created_at, id, user_id, content_package_id, score, result, total_time_taken, updated_at | |
Filter: (simulation_results.user_id = 827911) | |
Buffers: shared hit=1 | |
Planning time: 0.085 ms | |
Execution time: 0.076 ms | |
(17 rows) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
id | simulation_id | user_id | content_package_id | score | result | total_time_taken | created_at | updated_at | |
----+---------------+---------+--------------------+-------+--------+------------------+----------------------------+---------------------------- | |
1 | 1 | 827911 | 1099 | 10 | 1 | 300 | 2017-04-10 15:47:58.383046 | 2017-04-10 15:47:58.383046 | |
2 | 1 | 827911 | 1099 | 99 | 1 | 847 | 2017-04-11 21:37:59.559099 | 2017-04-11 21:37:59.559099 | |
3 | 1 | 827911 | 1099 | 77 | 0 | 103 | 2017-04-11 21:38:34.925895 | 2017-04-11 21:38:34.925895 | |
4 | 1 | 827911 | 1099 | 31 | 0 | 143 | 2017-04-11 21:38:40.246775 | 2017-04-11 21:38:40.246775 | |
5 | 1 | 827911 | 1099 | 53 | 0 | 153 | 2017-04-11 21:38:41.696413 | 2017-04-11 21:38:41.696413 | |
6 | 2 | 827911 | 1099 | 22 | 0 | 110 | 2017-04-11 21:39:18.465974 | 2017-04-11 21:39:18.465974 | |
7 | 2 | 827911 | 1099 | 77 | 1 | 103 | 2017-04-11 21:39:20.141829 | 2017-04-11 21:39:20.141829 | |
8 | 2 | 827911 | 1099 | 22 | 0 | 150 | 2017-04-11 21:39:21.619674 | 2017-04-11 21:39:21.619674 | |
9 | 2 | 827911 | 1099 | 60 | 0 | 197 | 2017-04-11 21:39:22.515027 | 2017-04-11 21:39:22.515027 | |
10 | 3 | 827911 | 1099 | 82 | 0 | 196 | 2017-04-11 21:39:23.290977 | 2017-04-11 21:39:23.290977 | |
11 | 3 | 827911 | 1099 | 36 | 1 | 124 | 2017-04-11 21:39:24.123781 | 2017-04-11 21:39:24.123781 | |
12 | 2 | 827911 | 1099 | 35 | 1 | 120 | 2017-04-11 21:39:25.082835 | 2017-04-11 21:39:25.082835 | |
13 | 1 | 827911 | 1099 | 46 | 1 | 142 | 2017-04-11 21:39:25.945943 | 2017-04-11 21:39:25.945943 | |
14 | 1 | 827911 | 1099 | 93 | 1 | 138 | 2017-04-11 21:39:34.295074 | 2017-04-11 21:39:34.295074 | |
15 | 2 | 827911 | 1099 | 47 | 0 | 188 | 2017-04-11 21:39:34.304328 | 2017-04-11 21:39:34.304328 | |
16 | 3 | 827911 | 1099 | 29 | 0 | 198 | 2017-04-11 21:39:34.312877 | 2017-04-11 21:39:34.312877 | |
17 | 1 | 827911 | 1099 | 11 | 0 | 131 | 2017-04-11 21:39:34.320998 | 2017-04-11 21:39:34.320998 | |
18 | 1 | 827911 | 1099 | 54 | 1 | 184 | 2017-04-11 21:39:34.328954 | 2017-04-11 21:39:34.328954 | |
19 | 2 | 827911 | 1099 | 99 | 0 | 165 | 2017-04-11 21:39:34.338804 | 2017-04-11 21:39:34.338804 | |
20 | 2 | 827911 | 1099 | 61 | 0 | 137 | 2017-04-11 21:39:34.349267 | 2017-04-11 21:39:34.349267 | |
21 | 1 | 827911 | 1099 | 48 | 0 | 180 | 2017-04-11 21:39:34.360706 | 2017-04-11 21:39:34.360706 | |
22 | 3 | 827911 | 1099 | 34 | 1 | 188 | 2017-04-11 21:39:34.369128 | 2017-04-11 21:39:34.369128 | |
23 | 2 | 827911 | 1099 | 96 | 1 | 168 | 2017-04-11 21:39:34.387152 | 2017-04-11 21:39:34.387152 | |
(23 rows) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
id | simulation_id | user_id | content_package_id | score | result | total_time_taken | created_at | updated_at | |
----+---------------+---------+--------------------+-------+--------+------------------+----------------------------+---------------------------- | |
23 | 2 | 827911 | 1099 | 96 | 1 | 168 | 2017-04-11 21:39:34.387152 | 2017-04-11 21:39:34.387152 | |
22 | 3 | 827911 | 1099 | 34 | 1 | 188 | 2017-04-11 21:39:34.369128 | 2017-04-11 21:39:34.369128 | |
21 | 1 | 827911 | 1099 | 48 | 0 | 180 | 2017-04-11 21:39:34.360706 | 2017-04-11 21:39:34.360706 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Goal of the queries was find the most recent records for each
simulation_id
.