2017-01-07 4 views
0

Имейте запрос Postgres, который слишком неэффективен. Надеясь, что кто-то может указать мне в правильном направлении, чтобы сделать этот запрос разумным для запуска. Я знаю, что линия суммы - это проблема не в том, как улучшить/исправить ее.Postgres Query неэффективен

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

Пожалуйста, отредактируйте свой вопрос и добавьте план выполнения, сгенерированный с помощью ** 'объяснять (анализировать, подробные)' **. [_Formatted_] (http://dba.stackexchange.com/help/formatting) ** текст **, пожалуйста, [без скриншотов] (http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-when-ask-a-question/285557 # 285557) –

ответ

2

Вероятно, вы пропустили состояние, присоединяясь 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 
+3

Еще один хороший пример того, почему следует избегать неявных объединений в предложении where –

2

Помимо @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 является optimization fences, а иногда и это не то, что вы хотите.