このクエリは機能しますが、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)
ライブテーブルを使用したプランの説明