2016-03-24 23 views
0

Aşağıda bulduğum sorgu çok yavaş.Yazmak için daha iyi bir yaklaşım görünümü

Temel olarak, bu üç tabloya katılarak diğer bilgilerle birlikte her workflow_id öğesinin en son durumunu almaya çalışıyorum.

Sorgu mantığı şöyledir:

  1. Grup tablo toplu adımı iş yürütme id yürütme ve max (step_execution_id) kullanılarak son adımı alarak ve bunları daha sonra adım yürütme kimliği
  2. Grup tablo tarafından kullanan tüm sütunları alarak job_instance_id üzerinde batch_job_execution ve en son çalıştırmayı geri alın. İşte

    SELECT workflow_id, 
         collabration_key, 
         TAB3.START_TIME     AS WORKFLOWDATE, 
         batch_step_execution.STEP_NAME AS CURRENT_STEP_NAME , 
         batch_step_execution.EXIT_CODE AS CURRENTSTEP , 
         batch_step_execution.start_time AS STEPTIME , 
         TAB3.EXIT_CODE     AS JOB_STATUS 
    FROM batch_step_execution 
         INNER JOIN (
         SELECT * 
         FROM rpx_id_mapping 
           INNER JOIN (
            SELECT batch_job_execution.job_execution_id, 
             batch_job_execution.job_instance_id , 
             batch_job_execution.START_TIME , 
             batch_job_execution.EXIT_CODE 
            FROM batch_job_execution 
            WHERE batch_job_execution.job_execution_id IN (
              SELECT MAX(job_execution_id) 
              FROM batch_job_execution 
              WHERE job_instance_id IN (
                SELECT job_id 
                FROM rpx_id_mapping 
               ) 
              GROUP BY job_instance_id 
             ) 
           ) TAB2 
           ON rpx_id_mapping.job_id = TAB2.job_instance_id 
         ) TAB3 
         ON batch_step_execution.job_execution_id = TAB3.job_execution_id 
    WHERE batch_step_execution.step_execution_id = (
         SELECT MAX(step_execution_id) 
         FROM batch_step_execution 
         WHERE batch_step_execution.job_execution_id = TAB3.job_execution_id 
         ) 
    ) TAB4 
    

    geçerli:

  3. İç 1 katılıp 2 id haritalama tabloyla katılan son aşama
  4. son yürütme ve iş yürütme bakarak katılmak à

Bu benim şimdiki kodudur tablolar yapısı.

enter image description here

enter image description here

enter image description here

aynı ulaşmak için daha iyi bir yaklaşım var mı? masa toplu adımı iş yürütme id icra ve job_instance_id ve almak üzerine tablo batch_job_execution adım yürütme kimliği
  • Grup kullanarak tüm sütunları alınırken sonra max (step_execution_id) kullanılarak son adımı alarak ve bunları tarafından

  • +0

    Analitik sorgulara bakın; Aynı tablonun birden çok kez çarpmasını önlemek istiyorsanız, hepsini bir kez birleştirin ve daha sonra istediğiniz satırları bulmak için analitiği kullanın. Etrafta çok sayıda örnek var; [işte size dün gelen] (http://stackoverflow.com/q/36183914/266304) yanıtlarda size bir başlangıç ​​noktası verebilecek bir kaç yaklaşımı vardır. –

    +0

    @AlexPoole Aslında tüm tabloları her zaman vuracağız, sadece her şey, her satırda mutlaka tüm satırları kullanmamamız. – DevG

    +0

    @AlexPoole Gerçekten analitik soruların daha iyi bir yaklaşım olacağını düşünmüyor musunuz? Bunu hiç kullanmadım. – DevG

    cevap

    2
    1. Grup son yürütme.
    2. İç 1 katılıp 2 Ben senin mantığını takip etmeye çalıştık

    id haritalama tabloyla katılan son aşama

  • son yürütme ve iş yürütme dayalı katılmak ve bu kullanarak aynı olduğunu düşünüyorum o zaman umarım sana bir şeyler basitleştirmek için nasıl bir fikir verir değilse

    SELECT * 
    FROM (
        SELECT workflow_id, 
          collabration_key, 
          bse.START_TIME AS WORKFLOWDATE, 
          bse.STEP_NAME AS CURRENT_STEP_NAME , 
          bse.EXIT_CODE AS CURRENTSTEP , 
          bse.start_time AS STEPTIME , 
          bse.EXIT_CODE AS JOB_STATUS, 
          ROW_NUMBER() OVER (PARTITION BY rim.job_execution_id, 
                  rim.job_id 
               ORDER BY  bse.step_execution_id DESC, 
                  bse.job_execution_id DESC) AS rn 
        FROM batch_step_execution bse 
          INNER JOIN rpx_id_mapping rim 
          ON ( bse.job_execution_id = rim.job_execution_id) 
          INNER JOIN batch_job_execution bje 
          ON (rim.job_id = bje.job_instance_id) 
    ) 
    WHERE rn = 1; 
    

    : analitik sorgu maksimum satır almak için.

  • +0

    Sorgunuzu anlamadan önce analiz sorguları hakkında çok fazla şey okumak zorundayım. teşekkür ederim, bunu test edeceğim ve istediğim şekilde çalıştığımı bulursam cevabını kabul edeceğim. – DevG

    +0

    @DevG Connor McDonald (şimdi, AskTom'un arkasındaki beyinlerin% 50'si), iyi bir saat izlemenin yapıldığı Oracle analizinde devam eden bir youtube video serisine (videolar için YAY!) Sahiptir. Dizi burada başlar: https://www.youtube.com/watch?v=xvZ4SmKtazs&list=PLJMaoEWvHwFJDyhMLCkNSSUQWw9waFkIj&index=1 –

    +0

    @KrisJohnston Bunu bilmek harika. Teşekkürler! – DevG

    İlgili konular