2016-03-24 2 views
0

私は非常に遅い検索クエリです。ビューを書くためのより良いアプローチ

基本的に、これらの3つのテーブルを結合することによって、他の情報とともに各workflow_idの最新ステータスを取得しようとしています。

クエリロジックは、このように書きます:ジョブ実行IDのテーブルバッチステップ実行によって

  1. グループとmax(step_execution_id)を使用して、最新のステップを取得して、テーブルでステップ実行ID
  2. グループを使用してすべての列を取得しますjob_instance_idでbatch_job_executionを実行し、最新の実行を取得します。
  3. インナーは1と2これは私の現在のコードで最新のステップの最新の実行とジョブ実行
  4. IDマッピングテーブルに参加

に基づいた結合に参加:ここ

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 

ですがテーブル構造。

enter image description here

enter image description here

enter image description here

同じことを達成するためのより良い方法はありますか?ジョブ実行IDのテーブルバッチステップ実行によって

+0

分析クエリを参照してください。同じテーブルに何度もヒットするのを避けたいので、それらをすべて一度結合してから、分析を使用して実際に必要な行を特定します。周囲には多くの例があります。 [ここに昨日からの1つ](http://stackoverflow.com/q/36183914/266304)は、あなたに出発点を与えるかもしれない答えにいくつかのアプローチを持っています。 –

+0

@AlexPoole実際に私たちは常にテーブルのすべてに当たっていますが、唯一のことはヒットごとに必ずしもすべての行を使用しないことです。 – DevG

+0

@AlexPooleあなたは、分析クエリがより良いアプローチになると本当に思いますか?これは決して使ったことはありません。 – DevG

答えて

2
  1. グループを用いて、最大 最新のステップ(step_execution_id)を取得し、その後 job_instance_idにテーブルbatch_job_executionによって
  2. グループをステップ実行IDを使用して、すべての 列を取得し、取得最新の実行。
  3. インナー1参加し、2、私はあなたのロジックに従うことを試みた

IDマッピングテーブルに参加する最新のステップ

  • の最新の実行、ジョブの実行に基づいて参加し、これを使用して同じだと思います最大行を取得するための分析的なクエリ:

    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; 
    

    もしそうでなければ、簡単に物事を単純化する方法のアイデアが得られます。

  • +0

    クエリを理解する前に、アナリティクスクエリについて多くのことを読んでおく必要があります。ありがとう、私はこれをテストし、私が望んでいたようにそれが働いていると分かったら、私はあなたの答えを受け入れるでしょう。 – DevG

    +0

    @DevG Connor McDonald(今AskTomの背後にある頭脳の50%)は、Oracleアナリティクスで進行中のyoutubeビデオシリーズ(ビデオのためのYAY!シリーズはここから始まります:https://www.youtube.com/watch?v=xvZ4SmKtazs&list=PLJMaoEWvHwFJDyhMLCkNSSUQWw9waFkIj&index=1 –

    +0

    @KrisJohnstonそれを知ってよかったです。おめでとうございます! – DevG

    関連する問題