虽然是熟悉的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的更多相关文章

  1. MapReduce: 一个巨大的倒退

    前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce 技术的文章, ...

  2. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  3. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  4. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  5. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇四:关于OneNote入库处理以及审核

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  6. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  7. Oracle数据库11g各版本介绍及功能比较

    .标准版和企 业版.所有这些版本都使用相同的通用代码库构建,这意味着企业的数据库管理软件可以轻松地从规模较小的单一处理器服务器扩展到多处理器服务器集 群,而无需更改一行代码.Oracle数据库11g企 ...

  8. [转]oracle 分析函数over

      oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...

  9. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  10. oracle直通车第二周习题

    1.教材第二章课后作业 1,2,3,4题. 答:1. 创建一查询,显示与Blake在同一部门工作的雇员的项目和受雇日期,但是Blake不包含在内. 2. 显示位置在Dallas的部门内的雇员姓名.变化 ...

随机推荐

  1. JSON字符串反序列化 动态泛型

    需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的. 方案一:将方法参数存成JSON字符串,然后JSON反序列化成对象,然后反射调用 目标方法时这样的: CommandResp send ...

  2. IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

    本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...

  3. JpaRepository动态代理执行原理

    本文基于spring-boot-starter-data-jpa:2.7.17分析 SpringBoot 里集成Jpa自动配置是如何处理的 通过分析SpringBoot 自动配置核心源码可以找到Jpa ...

  4. 开源flux适配昇腾NPU分享,体验120亿参数AI文生图模型

    这一期我们分享一位开源开发者参与flux适配昇腾NPU的实践经验,欢迎广大开发者对华为技术栈适配进行讨论. 开源适配实践 flux是一个AI图像生成模型,有120亿参数量,具有大量的用户基础,可以根据 ...

  5. 如何快速的开发一个完整的iOS直播app(采集篇)

    作者:袁峥链接:https://www.jianshu.com/p/c71bfda055fa来源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 开发一款直播app,首先需要 ...

  6. Kotlin:【set集合】集合创建、可变集合mutableSetOf、集合转换(List转换成Set,去掉重复元素)、distinct快捷去重函数、数组

  7. hello-world-python

    Hello World 各位朋友们,大家好,我是jason,欢迎来到我的博客. 今天,我教大家如何使用Python来写一个简单的"Hello World"程序. 如何使用Pytho ...

  8. LangChain基础篇 (04)

    LangChain 核心模块:Data Conneciton - Document Loaders 使用文档加载器从源中加载数据作为文档.一个文档是一段文字和相关的元数据. 如,有用于加载简单 .tx ...

  9. Goh:一款Go语言的预编译快速模板引擎。(Benchmark排名第一)

    https://github.com/OblivionOcean/Goh Goh 是一款Go语言的预编译快速模板引擎. English | 简体中文 目录 特性 性能测试 安装 使用 语法 特性 预编 ...

  10. 使用-数据湖Iceberg和现有hive数仓打通并使用

    一.集群配置 1.版本使用 技术 版本 iceberg 1.3.1 flink 1.16.1 spark 3.2.1 hive 2.3.7 dlc-presto 待定 2.集群配置调整 (1)使用hi ...