I noticed the server load was high. I saw that several instances of search by date where still running.
Looking at the query in question:
freshports.org=# explain
freshports.org-# SELECT count(DISTINCT CL.id) AS count
freshports.org-# FROM commit_log_ports CLP, commit_log CL JOIN commit_log_branches CLB ON CL.id = CLB.commit_log_id
freshports.org-# JOIN system_branch SB ON SB.branch_name = 'head' AND SB.id = CLB.branch_id
freshports.org-# WHERE CL.commit_date BETWEEN '2014/11/07'::timestamptz + SystemTimeAdjust()
freshports.org-# AND '2014/11/07'::timestamptz + SystemTimeAdjust() + '1 Day'
freshports.org-# AND CLP.commit_log_id = CL.id;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=684.40..684.41 rows=1 width=4)
-> Merge Join (cost=43.20..684.40 rows=1 width=4)
Merge Cond: (clb.commit_log_id = cl.id)
-> Nested Loop (cost=2.55..3125771.74 rows=4875 width=8)
Join Filter: (clb.commit_log_id = clp.commit_log_id)
-> Index Scan using commit_log_ports_pkey on commit_log_ports clp (cost=0.00..544853.97 rows=630110 width=4)
-> Materialize (cost=2.55..618.00 rows=273 width=4)
-> Hash Join (cost=2.55..616.64 rows=273 width=4)
Hash Cond: (clb.branch_id = sb.id)
-> Seq Scan on commit_log_branches clb (cost=0.00..485.26 rows=33626 width=8)
-> Hash (cost=2.54..2.54 rows=1 width=4)
-> Seq Scan on system_branch sb (cost=0.00..2.54 rows=1 width=4)
Filter: (branch_name = 'head'::text)
-> Sort (cost=40.61..40.63 rows=9 width=4)
Sort Key: cl.id
-> Index Scan using commit_log_commit_date on commit_log cl (cost=0.01..40.47 rows=9 width=4)
Index Cond: ((commit_date >= ('2014-11-07 00:00:00+00'::timestamp with time zone + '00:00:00'::interval)) AND (commit_date <= (('2014-11-07 00:00:00+00'::timestamp with time zone + '00:00:00'::interval) + '1 day'::interval)))
(17 rows)
freshports.org=#
The analysis for this query is available at http://explain.depesz.com/s/uCT
I redesigned the query to make use of explicit JOINs:
freshports.org=# explain
freshports.org-# SELECT count(DISTINCT CL.id) AS count
freshports.org-# FROM commit_log CL JOIN commit_log_ports CLP ON CLP.commit_log_id = CL.id
freshports.org-# AND CL.commit_date BETWEEN '2014/11/07'::timestamptz + SystemTimeAdjust()
freshports.org-# AND '2014/11/07'::timestamptz + SystemTimeAdjust() + '1 Day'
freshports.org-# JOIN commit_log_branches CLB ON CL.id = CLB.commit_log_id
freshports.org-# JOIN system_branch SB ON SB.branch_name = 'head'
freshports.org-# AND SB.id = CLB.branch_id;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=692.70..692.71 rows=1 width=4)
-> Nested Loop (cost=40.58..692.70 rows=1 width=4)
-> Nested Loop (cost=40.58..652.23 rows=1 width=8)
-> Hash Join (cost=40.58..651.95 rows=1 width=12)
Hash Cond: (clb.commit_log_id = cl.id)
-> Seq Scan on commit_log_branches clb (cost=0.00..485.26 rows=33626 width=8)
-> Hash (cost=40.47..40.47 rows=9 width=4)
-> Index Scan using commit_log_commit_date on commit_log cl (cost=0.01..40.47 rows=9 width=4)
Index Cond: ((commit_date >= ('2014-11-07 00:00:00+00'::timestamp with time zone + '00:00:00'::interval)) AND (commit_date <= (('2014-11-07 00:00:00+00'::timestamp with time zone + '00:00:00'::interval) + '1 day'::interval)))
-> Index Scan using system_branch_pkey on system_branch sb (cost=0.00..0.27 rows=1 width=4)
Index Cond: (id = clb.branch_id)
Filter: (branch_name = 'head'::text)
-> Index Scan using commit_log_ports_pkey on commit_log_ports clp (cost=0.00..40.25 rows=18 width=4)
Index Cond: (commit_log_id = cl.id)
(14 rows)
freshports.org=#
The analysis for that query is at http://explain.depesz.com/s/p3wn.
I’ll let readers describe what happened here…











