0

このクエリは機能しますが、5000 ミリ秒かかります。

SELECT 
    SUM(case 
        when ((TRUNC(OPEN_DATE) <= thedate and TRUNC(END_DATE) > thedate) or(TRUNC(OPEN_DATE) <= thedate and END_DATE Is Null)) then 1 
        else 0 
        end) as Open  
From ( 
    select * 
    FROM PROJECT 
    WHERE 
        PROGRAM_NAME = :program   
        AND ACTION_FOR_ORG = :orgName 
    )   
    cross join ( 
        select add_months(last_day(SYSDATE), level-7) as thedate 
        from dual 
        connect by level <= 12  
    )  
GROUP BY thedate
ORDER BY thedate

サブクエリを独自のテーブルにコピーすると

create table test_project as  
select * FROM PROJECT WHERE PROGRAM_NAME = :program   
AND ACTION_FOR_ORG = :orgName

次に、上記のクエリを実行しますが、サブクエリはコピーされたテーブルに次のように存在します。

From ( select * FROM test_project WHERE PROGRAM_NAME = :program   
AND ACTION_FOR_ORG = :orgName ) 

クエリには 10 ミリ秒かかります

OPEN_DATEこのクエリは、次の比較に基づいて、過去 5 か月および将来の月にわたってその月に開いていたプロジェクトの数を生成します (今後の月の開いているプロジェクトの数は、今日の月の合計にちょうど等しくなります) 。END_DATE

最適なパフォーマンスのために元のクエリを書き直す方法はありますか?

編集

OK、アクセスを許可されたプロジェクト テーブル (ウェル ビュー) の完全なコピーである 2 つ目のテーブルを作成しました。テーブルのコピーには約 5 秒かかりました。データの完全なセットと、私の sql クエリまたは以下の Egor のいずれかを使用すると、クエリは非常に高速です。ビューに何かがアップしています。サブクエリで View を使用して Explain Plan を吐き出そうとすると、十分な権限が得られません。これは、ビューの完全なコピーを使用した説明計画です

 Plan hash value: 3695211866

 ------------------------------------------------------------------------------------------------
 | Id  | Operation                        | Name        | Rows  | Bytes | Cost (%CPU)|     Time     |
 ------------------------------------------------------------------------------------------------
 |   0 | SELECT STATEMENT                 |             |   637 |  1277K|   163   (2)| 00:00:02 |
 |   1 |  SORT ORDER BY                   |             |   637 |  1277K|   163   (2)| 00:00:02 |
 |   2 |   HASH GROUP BY                  |             |   637 |  1277K|   163   (2)| 00:00:02 |
 |   3 |    MERGE JOIN CARTESIAN          |             |   637 |  1277K|   161   (0)| 00:00:02 |
 |   4 |     VIEW                         |             |     1 |     6 |     2   (0)| 00:00:01 |
 |*  5 |      CONNECT BY WITHOUT FILTERING|             |       |       |              |          |
 |   6 |       FAST DUAL                  |             |     1 |       |     2   (0)| 00:00:01 |
 |   7 |     BUFFER SORT                  |             |   637 |  1273K|   163   (2)| 00:00:02 |
 |*  8 |      TABLE ACCESS FULL           | COMMIT_TEST |   637 |  1273K|   159   (0)| 00:00:02 |

述語情報 (操作 ID で識別):


5 - filter(LEVEL<=12)
8 - filter("PROGRAM_NAME"='program_name' AND "ACTION_FOR_ORG"='action_for_org')

ノート


- dynamic sampling used for this statement (level=2)

ライブテーブルを使用したプランの説明 ここに画像の説明を入力

4

1 に答える 1

1
with
   PRJ as (
      select /*+ NO_UNNEST */ 
         trunc(OPEN_DATE) as OPEN_DATE,
         nvl(trunc(END_DATE), sysdate + 1000) as END_DATE
      from
         PROJECT
      where
         PROGRAM_NAME = :program
         and ACTION_FOR_ORG = :orgName
   ),
   DATES as (
      select
         add_months(trunc(last_day(SYSDATE)), level-7) as thedate
      from dual
      connect by level <= 12
   )
SELECT
   thedate,
   sum(case when thedate between open_date and end_date then 1 end) as Open
FROM
   DATES, PRJ
GROUP BY thedate
ORDER BY 1
于 2013-03-04T22:02:12.113 に答える