Oracle 查询检查失败超过 90%

Oracle query to check for failure more than 90 %

我有这样一种情况,我需要每 2 小时向 运行 写入一个监控查询,以便在处理的计数低于 90% 时发出警报。

假设我们有一个 Table 传入消息,其中捕获所有传入消息,另一个 table 捕获所有已处理消息。

这就是我想出的办法,这很有效,但我想知道是否有更好的方法来做到这一点?

SELECT (CASE WHEN PROCESSEDCOUNT <= INCOMINGCOUNT * .9 
THEN 'ALERT:: Process Count ' || PROCESSEDCOUNT || ' is less than 90% of Incoming count ' || INCOMINGCOUNT || '. '
ELSE 'FINE:: Process Count ' || PROCESSEDCOUNT || ' is more than or equal to 90% of Incoming count ' || INCOMINGCOUNT || '. '
END ) as Status
from 
(SELECT 
(SELECT COUNT(*) 
FROM INCOMING_TABLE D WHERE INSERTION_TIME > SYSDATE - (1/12) 
AND EXISTS (SELECT * FROM PROCESSED_TABLE C WHERE ( D.MESSAGE_ID = C.MESSAGE_ID)
AND C.PROCESSED_TIME > SYSDATE- (1/12))) AS PROCESSEDCOUNT,
(SELECT COUNT(*) FROM INCOMING_TABLE WHERE INSERTION_TIME > SYSDATE - (1/12)) AS INCOMINGCOUNT
FROM DUAL);

您正在从 INCOMING_TABLE 查询相同的数据两次,这不是很有效 ;-)

一种可能是外连接:

SELECT
   CASE
      WHEN COUNT(C.MESSAGE_ID) <= COUNT(*) * .9 
      THEN 'ALERT:: Process Count ' || COUNT(C.MESSAGE_ID) || ' is less than 90% of Incoming count ' || COUNT(*) || '. '
      ELSE 'FINE:: Process Count ' || COUNT(C.MESSAGE_ID) || ' is more than or equal to 90% of Incoming count ' || COUNT(*) || '. '
   END as Status
FROM INCOMING_TABLE D
LEFT OUTER JOIN PROCESSED_TABLE C
      ON C.MESSAGE_ID = D.MESSAGE_ID
     AND C.PROCESSED_TIME > SYSDATE- (1/12)
WHERE D.INSERTION_TIME > SYSDATE - (1/12)
/

如果您可以确定每个 message_id 在 PROCESSED_TABLE 中存在零条或一条记录,那么这将起作用。也许你可以添加一个 AND C.PROCESS_TYPE = ... 或其他东西来使该条件成真。

如果您不能保证最多连接到 PROCESSED_TABLE returns 一行,您可以将 EXISTS 移动到 COUNT 内部而不是 WHERE 子句,从而再次避免访问 INCOMING_TABLE 两次:

SELECT (CASE WHEN PROCESSEDCOUNT <= INCOMINGCOUNT * .9 
THEN 'ALERT:: Process Count ' || PROCESSEDCOUNT || ' is less than 90% of Incoming count ' || INCOMINGCOUNT || '. '
ELSE 'FINE:: Process Count ' || PROCESSEDCOUNT || ' is more than or equal to 90% of Incoming count ' || INCOMINGCOUNT || '. '
END ) as Status
from 
(
SELECT COUNT(*) INCOMINGCOUNT
     , COUNT(
          CASE 
             WHEN EXISTS (SELECT * FROM PROCESSED_TABLE C
                          WHERE D.MESSAGE_ID = C.MESSAGE_ID
                          AND C.PROCESSED_TIME > SYSDATE- (1/12))
             THEN 1
          END
       ) PROCESSEDCOUNT
FROM INCOMING_TABLE D
WHERE D.INSERTION_TIME > SYSDATE - (1/12)
)
/

(PS。如果您刚开始编写大量代码来处理消息队列,我还建议您像@DARK_A 一样研究高级队列,而不是构建您的自己的。在消息系统中有很多问题需要处理,所以如果您可以使用 Oracle 已经构建的东西,为什么还要麻烦 ;-)