In case you have your own slow SQL query, you can optimize it automatically here.
For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:
CREATE INDEX devices_idx_id ON "devices" ("id");
CREATE INDEX patient_devices_idx_unassignme_device_id_issuance ON "patient_devices" ("unassignment_datetime","device_id","issuance_datetime");
CREATE INDEX patient_devices_idx_device_id_issuance_dateti ON "patient_devices" ("device_id","issuance_datetime");
CREATE INDEX patients_idx_id ON "patients" ("id");
CREATE INDEX reads_idx_read_datetime ON "reads" ("read_datetime");
SELECT
foo.pa_first_name,
foo.pa_last_name,
MAX(max_read) AS read_datetime,
SUM(value) AS value,
serial_number
FROM
(SELECT
pa_first_name,
pa_last_name,
value,
serial_number,
re_read_datetime,
max_read
FROM
((SELECT
pa.first_name AS pa_first_name,
pa.last_name AS pa_last_name,
value AS value,
first_value(de.serial_number) OVER (PARTITION
BY
pa.id
ORDER BY
re.read_datetime DESC) AS serial_number,
re.read_datetime AS re_read_datetime,
MAX(re.read_datetime) OVER (PARTITION
BY
pd.id ) AS max_read
FROM
reads re
INNER JOIN
devices de
ON de.id = re.device_id
INNER JOIN
patient_devices pd
ON pd.device_id = de.id
AND re.read_datetime >= pd.issuance_datetime
AND (
(
pd.unassignment_datetime IS NULL
AND 'infinity'::timestamp < re.read_datetime
)
)
INNER JOIN
patients pa
ON pa.id = pd.patient_id
WHERE
re.read_datetime BETWEEN '2012-01-01 10:30:01' AND '2013-05-18 03:03:42')
UNION
DISTINCT (SELECT
pa.first_name AS pa_first_name,
pa.last_name AS pa_last_name,
value AS value,
first_value(de.serial_number) OVER (PARTITION
BY
pa.id
ORDER BY
re.read_datetime DESC) AS serial_number,
re.read_datetime AS re_read_datetime,
MAX(re.read_datetime) OVER (PARTITION
BY
pd.id ) AS max_read
FROM
reads re
INNER JOIN
devices de
ON de.id = re.device_id
INNER JOIN
patient_devices pd
ON pd.device_id = de.id
AND re.read_datetime >= pd.issuance_datetime
AND ((pd.unassignment_datetime < re.read_datetime))
INNER JOIN
patients pa
ON pa.id = pd.patient_id
WHERE
re.read_datetime BETWEEN '2012-01-01 10:30:01' AND '2013-05-18 03:03:42')
) AS union1
) AS foo
WHERE
read_datetime = max_read
GROUP BY
foo.pa_first_name,
foo.pa_last_name,
serial_number
ORDER BY
value DESC LIMIT 10