我的应用程序中有一种情况是显示符合不同标准的数据计数。由于计数的性能随着数据库的增长而下降,我们决定使用 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
子句,以便我可以显示每个类别中的文档是否可用。
由于此更改是为了提高性能,因此也不建议将其作为不同的查询运行。请帮助我,我已经用完了我有限的知识。
很抱歉错过了我已经尝试过的部分。
我已将上面的查询更改为与下面的每个都存在子句的联合。
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 个不同的查询运行,实际上它需要更多时间——整个联合查询中的单个段只需要 560 毫秒,而所有查询加起来需要大约 7 秒来生成输出。
由于我的要求只是确定任何此类记录的可用性,我不想浏览整个记录集并对其进行计数。
无论如何要优化/重写这个查询
谢谢你