ORACLE数据挖掘之 MSET-SPRT
虽然是熟悉的Oracle数据库,但关于机器学习、数据挖掘这方面的知识笔者起初也是不了解的,文中MSET相关设置来源于同事提供的sample,在测试过程中边查资料边学习吸收,也因此看到了别样的Oracle。
Oracle 的 MSET-SPRT 主要用于 高精度异常检测和预测性维护,尤其适用于关键业务系统,如数据库、存储、工业控制系统和数据中心运营环境。
MSET-SPRT翻译成中文是:多变量状态估计技术 - 序列概率比检验。
个人感觉这个名词翻译过来有些绕口.. 下面还是以英文简写词来代替。
在ORACLE官方文档中,是这样描述 MSET-SPRT 的:
The Multivariate State Estimation Technique - Sequential Probability Ratio Test (MSET-SPRT) algorithm monitors critical processes and detects subtle anomalies.
下面记录下MSET的测试过程,这里直接复用之前用于测试TPC-H的环境来验证:
- 1.新建测试表和配置表
- 2.创建构造测试数据的存储过程
- 3.模拟不同规模测试数据并插入
- 4.创建数据挖掘模型
- 5.查询预测结果
- 6.其他测试建议
1.新建测试表和配置表
这里只选择有实际意义的字段,构建TBL_IOT表:
CREATE TABLE "TPCH"."TBL_IOT"
("B1_T1" NUMBER(38,0),
"B1_T2" NUMBER(38,0),
"B1_T3" NUMBER(38,0),
"B2_T1" NUMBER(38,0),
"B2_T2" NUMBER(38,0),
"B2_T3" NUMBER(38,0),
"B3_T1" NUMBER(38,0),
"B3_T2" NUMBER(38,0),
"B3_T3" NUMBER(38,0),
"B4_T1" NUMBER(38,0),
"B4_T2" NUMBER(38,0),
"B4_T3" NUMBER(38,0),
"B5_T1" NUMBER(38,0),
"B5_T2" NUMBER(38,0),
"B5_T3" NUMBER(38,0),
"B6_T1" NUMBER(38,0),
"B6_T2" NUMBER(38,0),
"B6_T3" NUMBER(38,0),
"B7_T1" NUMBER(38,0),
"B7_T2" NUMBER(38,0),
"B7_T3" NUMBER(38,0),
"B8_T1" NUMBER(38,0),
"B8_T2" NUMBER(38,0),
"B8_T3" NUMBER(38,0),
"B9_T1" NUMBER(38,0),
"B9_T2" NUMBER(38,0),
"B9_T3" NUMBER(38,0),
"B10_T1" NUMBER(38,0),
"B10_T2" NUMBER(38,0),
"B10_T3" NUMBER(38,0),
"B11_T1" NUMBER(38,0),
"B11_T2" NUMBER(38,0),
"B11_T3" NUMBER(38,0),
"B12_T1" NUMBER(38,0),
"B12_T2" NUMBER(38,0),
"B12_T3" NUMBER(38,0),
"S" NUMBER(38,1),
"K_TS" TIMESTAMP (6)
);
创建 MSET_IOT_SETTINGS 表,用于存储数据挖掘算法的配置,插入 MSET-SPRT 算法的关键参数:
- 选择 MSET-SPRT 算法
- 开启自动数据准备
- 设置向量存储大小
- 设定 Alpha(假阳性)概率
- 设定异常警报阈值(次数 & 窗口大小)
-- Create setting table
CREATE TABLE MSET_IOT_SETTINGS(SETTING_NAME VARCHAR2(30),
SETTING_VALUE VARCHAR2(128));
-- Populate setting table
BEGIN
-- Select MSET-SPRT as the algorithm
INSERT INTO MSET_IOT_SETTINGS
VALUES(DBMS_DATA_MINING.ALGO_NAME,
DBMS_DATA_MINING.ALGO_MSET_SPRT);
-- Turn on automatic data preparation
INSERT INTO MSET_IOT_SETTINGS
VALUES(DBMS_DATA_MINING.PREP_AUTO,
DBMS_DATA_MINING.PREP_AUTO_ON);
-- Set memory vector
INSERT INTO MSET_IOT_SETTINGS
VALUES(DBMS_DATA_MINING.MSET_MEMORY_VECTORS, 100);
-- Set alpha
INSERT INTO MSET_IOT_SETTINGS
VALUES(DBMS_DATA_MINING.MSET_ALPHA_PROB, 0.1);
-- Set alert count
INSERT INTO MSET_IOT_SETTINGS
VALUES(DBMS_DATA_MINING.MSET_ALERT_COUNT, 3);
-- Set alert window
INSERT INTO MSET_IOT_SETTINGS
VALUES(DBMS_DATA_MINING.MSET_ALERT_WINDOW, 5);
-- Examples of other possible settings are:
-- (dbms_data_mining.mset_beta_prob, 0.1)
-- (dbms_data_mining.mset_adb_height, 0.01)
-- (dbms_data_mining.mset_std_tolerance, 3)
-- (dbms_data_mining.mset_heldaside, 500)
COMMIT;
END;
/
2.创建构造测试数据的存储过程
具体创建一个存储过程,传入行数作为参数,这样方便随时插入不同规模的数据。
这里模拟IOT场景,要求每秒一条数据。
插入数据前需要手工清空表,因为防止误操作,我没有将truncate表的高危命令直接写入到存储过程中,在执行存储过程之前,由人工来执行truncate表操作,用于插入数据的存储过程如下:
CREATE OR REPLACE PROCEDURE INSERT_IOT_DATA(p_total_rows IN NUMBER) AS
v_start_time TIMESTAMP := TO_TIMESTAMP('2025-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
BEGIN
FOR i IN 1..p_total_rows LOOP
INSERT INTO TBL_IOT (
B1_T1, B1_T2, B1_T3, B2_T1, B2_T2, B2_T3, B3_T1, B3_T2, B3_T3,
B4_T1, B4_T2, B4_T3, B5_T1, B5_T2, B5_T3, B6_T1, B6_T2, B6_T3,
B7_T1, B7_T2, B7_T3, B8_T1, B8_T2, B8_T3, B9_T1, B9_T2, B9_T3,
B10_T1, B10_T2, B10_T3, B11_T1, B11_T2, B11_T3, B12_T1, B12_T2, B12_T3,
S, K_TS
) VALUES (
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55), DBMS_RANDOM.VALUE(50, 55),
DBMS_RANDOM.VALUE(2, 5),
v_start_time + INTERVAL '1' SECOND * i
);
IF MOD(i, 1000) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/
注意:这里构建数据我预期是插入50到55之间的随机整数,但使用DBMS_RANDOM.VALUE(50,55),实际随机是带小数的,但结果是符合预期的。这是因为当向 NUMBER(38,0) 类型的列插入带小数的数据时,Oracle 并不会报错,而是会自动截断小数部分,只保留整数部分。可手工验证数据是否符合预期。
3.模拟不同规模测试数据并插入
下面需要分别测试不同数据规模:86w、130w、260w。
插入不同规模的数据之前,需要手工truncate表:
-- 插入数据前,确保已清空表数据,高危操作手工执行:
truncate table TBL_IOT;
-- 按需求插入不同规模数据:
-- 插入86万行
EXEC INSERT_IOT_DATA(860000);
-- 插入130万行
EXEC INSERT_IOT_DATA(1300000);
-- 插入260万行
EXEC INSERT_IOT_DATA(2600000);
-- 查询表占用空间
select SEGMENT_NAME, BYTES / 1024 / 1024 "MB" from dba_segments where SEGMENT_NAME = 'TBL_IOT';
4.创建数据挖掘模型
创建数据挖掘模型IOTMSET_MODEL,如果之前存在就删除掉再创建:
-- 删除数据挖掘模型IOTMSET_MODEL
exec dbms_data_mining.drop_model('IOTMSET_MODEL');
-- 创建数据挖掘模型IOTMSET_MODEL
BEGIN
dbms_data_mining.create_model(model_name => 'IOTMSET_MODEL',
mining_function => 'CLASSIFICATION',
data_table_name => 'TBL_IOT', --表名
case_id_column_name => 'K_TS', --时间戳列名
target_column_name => '',
settings_table_name => 'mset_iot_settings'); --配置表名
END;
/
创建模型完成后,会发现当前用户下的对象多了一系列以 DM$ 前缀命名的表和视图,这是 Oracle 数据挖掘(Oracle Data Mining, ODM)自动创建的模型存储对象,它们用于存储 MSET-SPRT 模型的相关数据。
5.查询预测结果
查询预测测试数据集的结果:
SELECT rownum, K_TS, pred FROM (SELECT K_TS, prediction(IOTMSET_MODEL using *)
over (ORDER BY K_TS) pred FROM tbl_iot)
where pred < 1 --异常
order by 2, 1 ;
6.其他测试建议
建议在测试开始和结束,创建awr的snapshot:
- exec DBMS_WORKLOAD_REPOSITORY.create_snapshot();
测试完成获取AWR报告:
- @?/rdbms/admin/awrrpt
- awrrpt_1_220_221.html
测试结果略。
ORACLE数据挖掘之 MSET-SPRT的更多相关文章
- MapReduce: 一个巨大的倒退
前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce 技术的文章, ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇四:关于OneNote入库处理以及审核
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗
ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性: Oracle.MYSQL与DB2可在所有主流平台上运行: SQL Server只能在Windows下运行: --安 ...
- Oracle数据库11g各版本介绍及功能比较
.标准版和企 业版.所有这些版本都使用相同的通用代码库构建,这意味着企业的数据库管理软件可以轻松地从规模较小的单一处理器服务器扩展到多处理器服务器集 群,而无需更改一行代码.Oracle数据库11g企 ...
- [转]oracle 分析函数over
oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...
- ORACLE优化器RBO与CBO介绍总结
RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...
- oracle直通车第二周习题
1.教材第二章课后作业 1,2,3,4题. 答:1. 创建一查询,显示与Blake在同一部门工作的雇员的项目和受雇日期,但是Blake不包含在内. 2. 显示位置在Dallas的部门内的雇员姓名.变化 ...
随机推荐
- Web端IM聊天消息该不该用浏览器本地存储?一文即懂!
本文由转转技术团队刘筱雨分享,原题"一文读懂浏览器本地存储:Web Storage",下文进行了排版和内容优化. 1.引言 鉴于目前浏览器技术的进步(主要是HTML5的普及),在W ...
- 零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
本文由微医云技术团队前端工程师张宇航分享,原题"从0到1打造一个 WebRTC 应用",有修订和改动. 1.引言 去年初,突如其来的新冠肺炎疫情让线下就医渠道几乎被切断,在此背景下 ...
- [.NET] 单位转换实践:深入解析 Units.NET
单位转换实践:深入解析 Units.NET 摘要 在现代软件开发中,准确处理不同单位的转换是一个常见而复杂的需求.无论是处理温度.长度.重量还是其他物理量,都需要可靠的单位转换机制.本文将深入介绍 U ...
- MySQL 开发规范
建表规约 1.[强制]每张表必须设置一个主键ID,并且这个主键ID要自增(在满足需要的情况下尽量短),除非是分库分表 理解:由于InnoDB存储引擎决定了需要有一个主键,而且这个主键ID是自增的话可以 ...
- Java技术栈总结-提升
1 java基础: 1.1 算法 1.1 排序算法:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序 1.2 二叉查找树.红黑树.B树.B+树.LSM树(分别有对应 ...
- RocketMQ -- offset管理
正文首先来明确一下 Offset 的含义, RocketMQ 中, 一 种类型的消息会放到 一 个 Topic 里,为了能够并行, 一般一个 Topic 会有多个 Message Queue (也可以 ...
- Linux下mysql的二进制安装与部分练习
鲸英训练营 0531作业 一.单选题(每题5分,总分25分) 1. 在MySQL中,一般使用( A )语句来指定一个已有数据库作为当前工作数据库. A.USED B.USE C.BEGIN D.GO ...
- 060_面向过程和面向对象区别 061_对象是什么_对象和数据管理 062_对象和类的关系_属性_成员变量_方法 063_一个典型类的写法和调用_类的UML图入门 064_内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程
060_面向过程和面向对象区别 061_对象是什么_对象和数据管理 062_对象和类的关系_属性_成员变量_方法 public class SxtStu {//定义了一个类,包含的成员变量,属性,方法 ...
- Q: 导出的照片时,批量修改创建时间和修改时间。
使用PowerShell脚本批量修改目录下所有照片(包括但不限于.jpg, .jpeg, .png等格式)的创建时间和最后修改时间,你可以采用以下脚本.这个脚本将遍历指定目录及其子目录下的所有支持的照 ...
- Flink CDC全量和增量同步数据如何保证数据的一致性
Apache Flink 的 Change Data Capture (CDC) 功能主要用于实时捕获数据库中的变更记录,并将其转换为事件流以供下游处理.为了保证全量和增量数据同步时数据的一致性.不丢 ...