[英]Postgres Query inefficient
Have a Postgres Query that is too inefficient. 有一个Postgres查询效率太低。 Hoping someone could point me in the right direction to make this query reasonable to run.
希望有人可以指出正确的方向,以使此查询合理运行。 I know the sum line is the issue just not how to improve / fix it.
我知道总和只是问题,而不是如何改进/修复它。
/* All Study Transfer Times */
WITH cte_images_duration AS
(
SELECT
ssi.study_id,
min(ssi.created_dt) AS first_image_created_dt,
--max(ssi.created_dt) AS last_image_created_dt,
max(ssi.created_dt) - min(ssi.created_dt) AS images_recieve_duration,
--count(ssi.study_id) AS image_count,
sum( cast(btrim(ssif.file_size, 'KB') as real) ) as transferSize
FROM study_series_instances AS ssi, study_series_instance_files as ssif
where ssi.created_dt >= '2017-1-6'
GROUP BY ssi.study_id
)
SELECT
s.institution AS "Institution",
s.accession_no AS "Accession#",
s.modalities,
to_char(timezone(f.time_zone, cte1.first_image_created_dt), 'MM/DD/YYYY HH:MI:SS pm') AS "Transfer Start Date/Time",
--to_char(timezone(f.time_zone, cte1.last_image_created_dt), 'MM/DD/YYYY HH:MI:SS pm') AS "Transfer Stop Date/Time",
to_char(cte1.images_recieve_duration, 'MI:SS') AS "Transfer Time",
--cte1.image_count AS "Image Count",
cte1.transferSize,
to_char(timezone(f.time_zone, s.study_unread_dt), 'MM/DD/YYYY HH:MI:SS pm') AS "Unread Date/Time"
--to_char(timezone(f.time_zone, s.approved_dt), 'MM/DD/YYYY HH:MI:SS pm') AS "Approved Date/Time"
FROM
cte_images_duration AS cte1
INNER JOIN studies AS s on s.id = cte1.study_id
INNER JOIN facilities f ON f.id = s.facility_id
where s.study_unread_dt > '2017-1-6'
ORDER BY s.accession_no
limit 10
Probably you've missed a condition while joining study_series_instances and study_series_instance_files. 在加入study_series_instances和study_series_instance_files时,您可能错过了条件。 Like:
喜欢:
FROM study_series_instances AS ssi
JOIN study_series_instance_files as ssif ON ssif.some_field = ssi.some_field
Apart from @Dmitry and @a_horse_with_no_name considerations, I'd try it this way as well: 除了@Dmitry和@a_horse_with_no_name注意事项之外,我也将尝试这种方式:
SELECT
s.institution AS "Institution",
s.accession_no AS "Accession#",
s.modalities,
to_char(timezone(f.time_zone, cte1.first_image_created_dt), 'MM/DD/YYYY HH:MI:SS pm') AS "Transfer Start Date/Time",
to_char(cte1.images_recieve_duration, 'MI:SS') AS "Transfer Time",
cte1.transferSize,
to_char(timezone(f.time_zone, s.study_unread_dt), 'MM/DD/YYYY HH:MI:SS pm') AS "Unread Date/Time"
FROM
(SELECT
ssi.study_id,
min(ssi.created_dt) AS first_image_created_dt,
max(ssi.created_dt) - min(ssi.created_dt) AS images_recieve_duration,
sum(cast(btrim(ssif.file_size, 'KB') as real)) AS transferSize
FROM
study_series_instances AS ssi,
/* Some JOIN condition is expected here */
study_series_instance_files AS ssif
WHERE ssi.created_dt >= '2017-1-6'
GROUP BY ssi.study_id
) AS cte1
INNER JOIN studies AS s on s.id = cte1.study_id
INNER JOIN facilities f ON f.id = s.facility_id
WHERE s.study_unread_dt > '2017-1-6'
ORDER BY s.accession_no
LIMIT 10
CTE expressions in PostgreSQL are optimization fences , and sometimes that's not what you want. PostgreSQL中的CTE表达式是优化围栏 ,有时这不是您想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.