繁体   English   中英

Postgres查询效率低下

[英]Postgres Query inefficient

有一个Postgres查询效率太低。 希望有人可以指出正确的方向,以使此查询合理运行。 我知道总和只是问题,而不是如何改进/修复它。

/* 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

在加入study_series_instances和study_series_instance_files时,您可能错过了条件。 喜欢:

FROM study_series_instances AS ssi
  JOIN study_series_instance_files as ssif ON ssif.some_field = ssi.some_field

除了@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

PostgreSQL中的CTE表达式是优化围栏 ,有时这不是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM