Oracle指标级别判断
目前有一个简单的指标级别的判断逻辑,其逻辑是在数据中通过oracle的function进行判断。
示例为:
select kpi1,get_kpi_level(kpi1当前值得,对比历史值) kpi_evel from XX
但是用户要求区分忙时和闲时。比如12和凌晨1点的阀值是不同的,重大节假日和平时是不同的, 甚至判断的方式都有可能不同,遇到此类情况怎么办?
step 1:设计一个二维表存储指标的阀值得和判断方式,示例格式为:
A指标表:
指标1 最小值1 最大值1 对应级别1 最小值2 最大值2 对应级别2 波动最小值1 波动最小值1 对应级别1 波动最小值2 波动最小值2 对应级别2...
时间段 假日标识
B假日表:
假日标识 开始时间 结束时间
在判断的过程中使用游标进行提取当前时间段对方的指标阀值的信息,进行判断,得出指标级别。
step 2:思考对于大数据量的数据,每条数据都开启游标进行取阀值信息且这些信息都是相同的(因为每次核查的时间范围是固定的),应该怎么减少游标的使用次数?
使用oracle package的全局变量的特性.示例程序为:
CREATE OR REPLACE PACKAGE PKG_KPI_TEST IS PROCEDURE INITIALVALUE; FUNCTION GETVALUE RETURN VARCHAR2; TYPE C_TYPE IS REF CURSOR; END; CREATE OR REPLACE PACKAGE BODY PKG_KPI_TEST IS first_result DATE; hour_id NUMBER; PROCEDURE INITIALVALUE IS MYCUR C_TYPE; BEGIN OPEN MYCUR FOR SELECT SYSDATE, 123 FROM DUAL; DBMS_OUTPUT.PUT_LINE('全局变量初始化完成'); FETCH MYCUR INTO FIRST_RESULT, HOUR_ID; END; FUNCTION GETVALUE RETURN VARCHAR2 IS BEGIN RETURN to_char(first_result,'yyyy-mm-dd HH24:mi:ss')||','||to_char(hour_id); END; END PKG_KPI_TEST;
每次执行时候都调用进行初始化:
BEGIN PKG_KPI_TEST.INITIALVALUE; END;
然后调用包的函数利用代表性变量进行判断。
SELECT PKG_KPI_TEST.GETVALUE FROM dual
这样就达到了减少游标使用次数的问题。
step 3:如果取历史值过于耗时过长或消耗的资源过多,而我们的核查频率又过于频繁,可以定时将根据相应的算法将历史值存储生成一个静态配置表,每次对比都从此表中取相应的数据。
如此一个小型简单的指标阀值判断的后台基础框架即可搭建完成。
关于package的全局变量特性请参阅:http://blog.csdn.net/47522341/article/details/3167307