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);
- PROCESSED_TABLE也用于存储其他记录,即
我需要使用 EXISTS 来计算进程数的原因。
- 我理解在两个 table 中捕获的时间可能不属于同一时间
持续时间。我们现在不担心,只是想
确保处理大部分记录。
- 如果有帮助,我们正在使用 oracle 11g。
您正在从 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 已经构建的东西,为什么还要麻烦 ;-)
我有这样一种情况,我需要每 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);
- PROCESSED_TABLE也用于存储其他记录,即 我需要使用 EXISTS 来计算进程数的原因。
- 我理解在两个 table 中捕获的时间可能不属于同一时间 持续时间。我们现在不担心,只是想 确保处理大部分记录。
- 如果有帮助,我们正在使用 oracle 11g。
您正在从 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 已经构建的东西,为什么还要麻烦 ;-)