アプリケーションで、異なる基準に一致するデータの数を表示する状況があります。データベースの成長に対してカウントのパフォーマンスが低下しているため、exists 句を使用して可用性情報のみを表示することにしました。
以下は私のテーブル構造です
Table: DocInfo
---------------------------------------
DocId number
DocName varchar(250)
DocStatus number
SignedBy number
ForwardedBy number
ForwardCount number
DocOwner number
MgrID number
ProjectId number
カウントを行う現在のクエリは次のようになります
SELECT NVL(SUM(CASE
WHEN (DocStatus IN (1150,1155,1170,1182,1190) AND
DocOwner=56366 AND
ForwardCount=0)
THEN 1
ELSE 0
END), 0) "ForReview",
NVL(SUM(CASE
WHEN (DocStatus IN (1200) And
MgrID = 56366 AND
ForwardCount = 0 )
THEN 1
ELSE 0
END), 0) "Accepted" ,
NVL(SUM(CASE
WHEN (DocStatus IN (1150,1155,1170,1182,1190) AND
DocOwner=56366 AND
MgrID = 0 )
THEN 1
ELSE 0
END), 0) "Waiting"
FROM DocInfo
WHERE ProjectId = 313 and
(DocOwner = 56366 or MgrID = 56366)
exists
ドキュメントが各カテゴリで利用可能かどうかを示すことができるように、カウントを句に変更する必要があります。
この変更はパフォーマンスを向上させるためのものであるため、これを別のクエリとして実行することもお勧めできません。助けてください、限られた知識を使い果たしました。
すでに試した部分を見逃して申し訳ありません。
上記のクエリを、以下のようにそれぞれに exists 句を含むユニオンに変更しました。
SELECT 'ForReview' AS A
FROM DUAL
WHERE EXISTS (SELECT NULL
FROM DocInfo
WHERE ProjectId = 313 and
(DocOwner = 56366 or MgrID = 56366) and
(DocStatus IN (1150,1155,1170,1182,1190) AND
DocOwner=56366 AND
ForwardCount=0))
UNION
SELECT 'Accepted' AS A
FROM DUAL
WHERE EXISTS (SELECT NULL
FROM DocInfo
WHERE ProjectId = 313 and
(DocOwner = 56366 or MgrID = 56366) and
(DocStatus IN (1200) And
MgrID = 56366 AND
ForwardCount = 0 ))
UNION
SELECT 'Waiting' AS A
FROM DUAL
WHERE EXISTS (SELECT NULL
FROM DocInfo
WHERE ProjectId = 313 and
(DocOwner = 56366 or MgrID = 56366) and
(DocStatus IN (1150,1155,1170,1182,1190) AND
DocOwner=56366 AND
MgrID = 0))
私は 3 つの条件しか言及していませんが、私の実際のアプリケーションには、このクエリに追加する 8 つの異なる条件があります。したがって、8 つの Exists 句がある場合、8 つの異なるクエリとして内部的に実行され、実際にはより多くの時間がかかります。ユニオン クエリ全体の 1 つのセグメントは 560 ミリ秒しかかかりませんが、すべてのクエリを合わせて出力を生成するには約 7 秒かかります。
私の要件は、そのようなレコードの可用性を識別することだけであるため、レコードセット全体をナビゲートしてカウントしたくありません。
このクエリを最適化/書き換える方法はありますか
ありがとうございました