自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
在Oracle Database 12c Release 1 (12.1)版本中,引入了对SQL计划管理(SPM)功能的增强,特别是关于SQL计划基线的自动进化机制。这一改进允许数据库更加智能地管理和优化SQL查询的执行计划,确保即使数据分布发生变化,也能维持高效的查询性能。
ASPM的核心理念在于其能够根据实时运行时统计信息来评估不同执行计划的表现,并据此决定是否需要采用新的执行计划。这意味着,即使是在数据库重启之后,优化器也能利用之前收集到的信息做出更加明智的选择。
一、SQL计划管理的基础
最初在Oracle 11g中引入的SQL计划管理,旨在通过固定一组已验证为高效的执行计划来稳定查询性能。这种方法被称为“保守的计划选择策略”,因为它倾向于使用经过验证的执行计划,而不是每次都让优化器重新评估所有可能的执行路径。到了Oracle 12c,虽然这个核心理念没有改变,但引入了一些重要的更新以进一步提升自动化程度和灵活性。
二、SYS_AUTO_SPM_EVOLVE_TASK介绍
2.1 自动化SQL计划基线的进化
在Oracle数据库12C中,现有基线的演变被自动化为称为SYS_AUTO_SPM_EVOVES_TASK的顾问任务,该任务是由自动化数据库维护任务下现有的“ SQL Tuning Advisor”客户端触发的。
CONN sys@pdb1 AS SYSDBACOLUMN client_name FORMAT A35
COLUMN task_name FORMAT a30SELECT client_name, task_name
FROM dba_autotask_task;CLIENT_NAME TASK_NAME
----------------------------------- ------------------------------
sql tuning advisor AUTO_SQL_TUNING_PROG
auto optimizer stats collection gather_stats_prog
auto space advisor auto_space_advisor_progSQL>
2.2 手动干预与任务管理
在Oracle 12c中,一个名为SYS_AUTO_SPM_EVOLVE_TASK的新任务被引入,用于自动进化现有的SQL计划基线。这个任务作为数据库维护任务的一部分,由现有的"sql tuning advisor"客户端触发。这意味着,一旦发现有更优的执行计划,系统可以自动对其进行评估,并在确认其优势后将其纳入基线之中。
CONN sys@pdb1 AS SYSDBACOLUMN parameter_name FORMAT A25
COLUMN parameter_value FORMAT a15SELECT parameter_name, parameter_value
FROM dba_advisor_parameters
WHERE task_name = 'SYS_AUTO_SPM_EVOLVE_TASK'
AND parameter_value != 'UNUSED'
ORDER BY parameter_name;PARAMETER_NAME PARAMETER_VALUE
------------------------- ---------------
ACCEPT_PLANS TRUE
DAYS_TO_EXPIRE UNLIMITED
DEFAULT_EXECUTION_TYPE SPM EVOLVE
EXECUTION_DAYS_TO_EXPIRE 30
JOURNALING INFORMATION
MODE COMPREHENSIVE
TARGET_OBJECTS 1
TIME_LIMIT 3600
_SPM_VERIFY TRUESQL>
尽管自动化的进化过程极大简化了管理负担,但在某些情况下,手动干预仍然是必要的。例如,如果想要阻止新的计划自动被接受,可以调整ACCEPT_PLANS参数为FALSE:
BEGINDBMS_SPM.set_evolve_task_parameter(task_name => 'SYS_AUTO_SPM_EVOLVE_TASK',parameter => 'ACCEPT_PLANS',value => 'FALSE');
END;
/
DBMS_SPM 包有一个名为 REPORT_AUTO_EVOLVE_TASK 的函数,用于显示自动进化任务所采取的行动的信息。如果没有指定参数,则会为最新的任务运行生成文本报告。
SET LONG 1000000 PAGESIZE 1000 LONGCHUNKSIZE 100 LINESIZE 100SELECT DBMS_SPM.report_auto_evolve_task
FROM dual;REPORT_AUTO_EVOLVE_TASK
----------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
---------------------------------------------------------------------------------------------Task Information:---------------------------------------------Task Name : SYS_AUTO_SPM_EVOLVE_TASKTask Owner : SYSDescription : Automatic SPM Evolve TaskExecution Name : EXEC_461Execution Type : SPM EVOLVEScope : COMPREHENSIVEStatus : COMPLETEDStarted : 02/19/2025 15:53:33Finished : 02/19/2025 15:53:35Last Updated : 02/19/2025 15:53:35Global Time Limit : 3600Per-Plan Time Limit : UNUSEDNumber of Errors : 0
---------------------------------------------------------------------------------------------SUMMARY SECTION
---------------------------------------------------------------------------------------------Number of plans processed : 0Number of findings : 0Number of recommendations : 0Number of errors : 0
---------------------------------------------------------------------------------------------
SQL>
三、手工演进SPB(SQL Plan Baselines)
在之前的版本中,使用EVOLVE_SQL_PLAN_BASELINE函数来实现SQL计划基线的演变。在12c中,这已被基于任务的方法所取代,通常涉及以下步骤。
- CREATE_EVOLVE_TASK
- EXECUTE_EVOLVE_TASK
- REPORT_EVOLVE_TASK
- IMPLEMENT_EVOLVE_TASK
此外,以下函数可以与进化任务进行交互:
- CANCEL_EVOLVE_TASK
- RESUME_EVOLVE_TASK
- RESET_EVOLVE_TASK
为了展示这一点,我们需要创建一个SQL计划基线:
3.1 创建并填充测试表。
CONN test/test@pdb1DROP TABLE spm_test_tab PURGE;CREATE TABLE spm_test_tab (id NUMBER,description VARCHAR2(50)
);INSERT /*+ APPEND */ INTO spm_test_tab
SELECT level,'Description for ' || level
FROM dual
CONNECT BY level <= 10000;
COMMIT;
使用未索引的列查询表,这会导致对整个表进行扫描。
SET AUTOTRACE TRACESELECT description
FROM spm_test_tab
WHERE id = 99;Execution Plan
----------------------------------------------------------
Plan hash value: 1107868462----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 14 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| SPM_TEST_TAB | 1 | 25 | 14 (0)| 00:00:01 |
----------------------------------------------------------------------------------
通过查询V$SQL视图来识别SQL语句的SQL_ID。
CONN sys@pdb1 AS SYSDBASELECT sql_id
FROM v$sql
WHERE plan_hash_value = 1107868462
AND sql_text NOT LIKE 'EXPLAIN%';SQL_ID
-------------
gat6z1bc6nc2dSQL>
3.2 使用此SQL_ID手动加载SQL计划基线。
SET SERVEROUTPUT ON
DECLAREl_plans_loaded PLS_INTEGER;
BEGINl_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => 'gat6z1bc6nc2d');DBMS_OUTPUT.put_line('Plans Loaded: ' || l_plans_loaded);
END;
/
Plans Loaded: 1PL/SQL procedure successfully completed.SQL>
DBA_SQL_PLAN_BASELINES 视图提供了有关 SQL 计划基线的信息。我们可以看到有一个与我们的基准关联的计划,该计划已启用并接受。
COLUMN sql_handle FORMAT A20
COLUMN plan_name FORMAT A30SELECT sql_handle, plan_name, enabled, accepted
FROM dba_sql_plan_baselines
WHERE sql_text LIKE '%spm_test_tab%'
AND sql_text NOT LIKE '%dba_sql_plan_baselines%';SQL_HANDLE PLAN_NAME ENA ACC
-------------------- ------------------------------ --- ---
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5tb65c37c8 YES YES
3.3刷新共享池以强制进行另一个硬解析
然后在ID列上创建索引,然后重复查询以查看对执行计划的影响。
CONN sys@pdb1 AS SYSDBA
ALTER SYSTEM FLUSH SHARED_POOL;CONN test/test@pdb1CREATE INDEX spm_test_tab_idx ON spm_test_tab(id);
EXEC DBMS_STATS.gather_table_stats(USER, 'SPM_TEST_TAB', cascade=>TRUE);SET AUTOTRACE TRACESELECT description
FROM spm_test_tab
WHERE id = 99;Execution Plan
----------------------------------------------------------
Plan hash value: 1107868462----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 14 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| SPM_TEST_TAB | 1 | 25 | 14 (0)| 00:00:01 |
----------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("ID"=99)Note
------ SQL plan baseline "SQL_PLAN_7qxjk7bch8h5tb65c37c8" used for this statement
请注意,查询没有使用新创建的索引,即使我们强制执行硬解析。注释解释了SQL计划基线被使用的原因。查看DBA_SQL_PLAN_BASELINES视图我们可以看到原因。
CONN sys@pdb1 AS SYSDBA
COLUMN sql_handle FORMAT A20
COLUMN plan_name FORMAT A30SELECT sql_handle, plan_name, enabled, accepted
FROM dba_sql_plan_baselines
WHERE sql_handle = 'SQL_7b76323ad90440b9';SQL_HANDLE PLAN_NAME ENA ACC
-------------------- ------------------------------ --- ---
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5t3652c362 YES NO
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5tb65c37c8 YES YESSQL>
SQL 计划基准线现在包含第二个计划,但尚未被接受。
如果您在DBA_SQL_PLAN_BASELINES视图中没有看到新行,请返回并重新运行"spm_test_tab"中的查询,直到您这样做。有时服务器需要几次尝试才能注意到对其他计划的需求。
3.4 创建新的进化任务
要使用新计划,我们需要等待维护窗口或手动发展SQL计划基线。为此基线创建一个新的进化任务。
SET SERVEROUTPUT ON
DECLAREl_return VARCHAR2(32767);
BEGINl_return := DBMS_SPM.create_evolve_task(sql_handle => 'SQL_7b76323ad90440b9');DBMS_OUTPUT.put_line('Task Name: ' || l_return);
END;
/
Task Name: TASK_21PL/SQL procedure successfully completed.SQL>
执行进化任务。
SET SERVEROUTPUT ON
DECLAREl_return VARCHAR2(32767);
BEGINl_return := DBMS_SPM.execute_evolve_task(task_name => 'TASK_21');DBMS_OUTPUT.put_line('Execution Name: ' || l_return);
END;
/
Execution Name: EXEC_471PL/SQL procedure successfully completed.SQL>
进化任务结果报告。
SET LONG 1000000 PAGESIZE 1000 LONGCHUNKSIZE 100 LINESIZE 100SELECT DBMS_SPM.report_evolve_task(task_name => 'TASK_21', execution_name => 'EXEC_471') AS output
FROM dual;OUTPUT
----------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
---------------------------------------------------------------------------------------------Task Information:---------------------------------------------Task Name : TASK_21Task Owner : SYSExecution Name : EXEC_471Execution Type : SPM EVOLVEScope : COMPREHENSIVEStatus : COMPLETEDStarted : 02/19/2025 16:38:15Finished : 02/19/2025 16:38:16Last Updated : 02/19/2025 16:38:16Global Time Limit : 2147483646Per-Plan Time Limit : UNUSEDNumber of Errors : 0
---------------------------------------------------------------------------------------------SUMMARY SECTION
---------------------------------------------------------------------------------------------Number of plans processed : 2Number of findings : 2Number of recommendations : 2Number of errors : 0
---------------------------------------------------------------------------------------------DETAILS SECTION
---------------------------------------------------------------------------------------------Object ID : 2Test Plan Name : SQL_PLAN_7qxjk7bch8h5t3652c362Base Plan Name : SQL_PLAN_7qxjk7bch8h5tb65c37c8SQL Handle : SQL_7b76323ad90440b9Parsing Schema : SYSTest Plan Creator : SYSSQL Text : SELECT description FROM spm_test_tab WHERE id = 99Execution Statistics:
-----------------------------Base Plan Test Plan---------------------------- ----------------------------Elapsed Time (s): .00001 .000001CPU Time (s): .000016 .000001Buffer Gets: 4 0Optimizer Cost: 13 2Disk Reads: 0 0Direct Writes: 0 0Rows Processed: 0 0Executions: 10 10FINDINGS SECTION
---------------------------------------------------------------------------------------------Findings (1):
-----------------------------1. The plan was verified in 0.01700 seconds. It passed the benefit criterionbecause its verified performance was 14.66841 times better than that of thebaseline plan.Recommendation:
-----------------------------Consider accepting the plan. Executedbms_spm.accept_sql_plan_baseline(task_name => 'TASK_21', object_id => 2,task_owner => 'SYS');EXPLAIN PLANS SECTION
---------------------------------------------------------------------------------------------Baseline Plan
-----------------------------Plan Id : 101Plan Hash Value : 3059496904-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 13 | 00:00:01 |
| * 1 | TABLE ACCESS FULL | SPM_TEST_TAB | 1 | 25 | 13 | 00:00:01 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter("ID"=99)Test Plan
-----------------------------Plan Id : 102Plan Hash Value : 911393634---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 2 | 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED | SPM_TEST_TAB | 1 | 25 | 2 | 00:00:01 |
| * 2 | INDEX RANGE SCAN | SPM_TEST_TAB_IDX | 1 | | 1 | 00:00:01 |
---------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("ID"=99)---------------------------------------------------------------------------------------------Object ID : 3Test Plan Name : SQL_PLAN_7qxjk7bch8h5t3652c362Base Plan Name : SQL_PLAN_7qxjk7bch8h5tb65c37c8SQL Handle : SQL_7b76323ad90440b9Parsing Schema : SYSTest Plan Creator : SYSSQL Text : SELECT description FROM spm_test_tab WHERE id = 99Execution Statistics:
-----------------------------Base Plan Test Plan---------------------------- ----------------------------Elapsed Time (s): .000009 .000001CPU Time (s): 0 0Buffer Gets: 4 0Optimizer Cost: 13 2Disk Reads: 0 0Direct Writes: 0 0Rows Processed: 0 0Executions: 10 10FINDINGS SECTION
---------------------------------------------------------------------------------------------Findings (1):
-----------------------------1. The plan was verified in 0.00600 seconds. It passed the benefit criterionbecause its verified performance was 14.66667 times better than that of thebaseline plan.Recommendation:
-----------------------------Consider accepting the plan. Executedbms_spm.accept_sql_plan_baseline(task_name => 'TASK_21', object_id => 3,task_owner => 'SYS');EXPLAIN PLANS SECTION
---------------------------------------------------------------------------------------------Baseline Plan
-----------------------------Plan Id : 103Plan Hash Value : 3059496904-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 13 | 00:00:01 |
| * 1 | TABLE ACCESS FULL | SPM_TEST_TAB | 1 | 25 | 13 | 00:00:01 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter("ID"=99)Test Plan
-----------------------------Plan Id : 104Plan Hash Value : 911393634---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 2 | 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED | SPM_TEST_TAB | 1 | 25 | 2 | 00:00:01 |
| * 2 | INDEX RANGE SCAN | SPM_TEST_TAB_IDX | 1 | | 1 | 00:00:01 |
---------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("ID"=99)---------------------------------------------------------------------------------------------
3.5 接受新的进化任务
如果演进任务已完成并已报告建议,建议使用 ACCEPT_SQL_PLAN_BASELINE,但您应该真正使用 IMPLEMENT_EVOLVE_TASK。
SET SERVEROUTPUT ON
DECLAREl_return NUMBER;
BEGINl_return := DBMS_SPM.implement_evolve_task(task_name => 'TASK_21');DBMS_OUTPUT.put_line('Plans Accepted: ' || l_return);
END;
/
Plans Accepted: 2PL/SQL procedure successfully completed.SQL>
DBA_SQL_PLAN_BASELINES 视图显示第二个计划已被接受。
CONN sys/pdb1 AS SYSDBASELECT sql_handle, plan_name, enabled, accepted
FROM dba_sql_plan_baselines
WHERE sql_handle = 'SQL_7b76323ad90440b9';SQL_HANDLE PLAN_NAME ENA ACC
-------------------- ------------------------------ --- ---
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5t3652c362 YES YES
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5tb65c37c8 YES YESSQL>
重复之前的测试表明,现在可以使用更高效的计划。
CONN test/test@pdb1SET AUTOTRACE TRACE LINESIZE 130SELECT description
FROM spm_test_tab
WHERE id = 99;Execution Plan
----------------------------------------------------------
Plan hash value: 2338891031--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| SPM_TEST_TAB | 1 | 25 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | SPM_TEST_TAB_IDX | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("ID"=99)Note
------ SQL plan baseline "SQL_PLAN_7qxjk7bch8h5t3652c362" used for this statement
3.6 删除计划
如果您想删除计划,使用 DROP_SQL_PLAN_BASELINE 函数将其丢弃。
CONN sys@pdb1 AS SYSDBASET SERVEROUTPUT ON
DECLAREl_plans_dropped PLS_INTEGER;
BEGINl_plans_dropped := DBMS_SPM.drop_sql_plan_baseline (sql_handle => 'SQL_7b76323ad90440b9');DBMS_OUTPUT.put_line('Plans Dropped: ' || l_plans_dropped);
END;
/
Plans Dropped: 2PL/SQL procedure successfully completed.SQL>
查看执行计划
SET AUTOTRACE TRACE LINESIZE 130SELECT descriptionFROM spm_test_tabWHERE id = 99;Execution Plan
----------------------------------------------------------
Plan hash value: 2338891031--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| SPM_TEST_TAB | 1 | 25 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | SPM_TEST_TAB_IDX | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("ID"=99)
通过这种方式,管理员能够细致地控制哪些计划被采纳以及何时采纳,从而确保数据库性能始终处于最优状态。
三、总结
综上所述,Oracle 12c中的自适应SQL计划管理不仅增强了数据库自我优化的能力,还提供了足够的灵活性让管理员根据具体需求进行定制化配置。这对于保持复杂环境下的高效运行至关重要。
相关文章:
自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
在Oracle Database 12c Release 1 (12.1)版本中,引入了对SQL计划管理(SPM)功能的增强,特别是关于SQL计划基线的自动进化机制。这一改进允许数据库更加智能地管理和优化SQL查询的执行计划,确保即使数据分布发生变化&…...
什么是DeFi (去中心化金融)
DeFi (去中心化金融) 概述 💰 1. DeFi 基础概念 1.1 什么是 DeFi? DeFi 是建立在区块链上的金融服务生态系统,它: 无需中心化中介开放且透明无需许可即可参与代码即法律 1.2 DeFi 的优势 开放性:任何人都可以参与…...
计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly
Arxiv日期:2024.2.14机构:Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论:十进制加法任务上的长度泛化最佳组合: FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…...
SpringAI做对了什么
开发|界面|引擎|交付|副驾——重写全栈法则:AI原生的倍速造应用流 你好,这里是nine[谈架构]系列。 欢迎关注评论私信交流~ SpringAI 在 AI 编程领域延续了Spring的诸多优势,从易于集成、到通用…...
DeepSeek预测25考研分数线
25考研分数马上要出了。 目前,多所大学已经陆续给出了分数查分时间,综合往年情况来看,每年的查分时间一般集中在2月底。 等待出成绩的日子,学子们的心情是万分焦急,小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...
C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector
C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector code review! 文章目录 C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector1. `std::copy`1.1.用法1.2.示例2.`std::vector::assign`2.1.用法2.2.示例3.区别总结4.支持assign的容器和不支持ass…...
文件IO(20250217)
1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...
Django5 实用指南(四)URL路由与视图函数
4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py&#…...
Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路
一、资料快车 1、深入了解Android输入系统:https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考: 2、系统程序分析方法 1)加入log,并跟着log一步步分析 -logc…...
Java中Map循环安全的删除数据的4中方法
文章目录 前言一、使用Iterator删除二、使用 removeIf(Java 8)三、遍历时记录需要删除的键(不推荐)四、使用 Stream(Java 8)总结 前言 在 Java 中,遍历 HashMap 并删除数据时,直接使…...
蓝桥杯(B组)-每日一题(1093字符逆序)
c中函数: reverse(首位置,尾位置) reverse(s.begin(),s.end()) 头文件:<algorithm> #include<iostream> #include<algorithm>//运用reverse函数的头文件 using namespace std; int main() {string s;//定义一…...
【数据分析】3 数据分析成长之路
职业发展路径: 向上发展(技术方向):可以详细说明成为数据科学家或专家所需的具体技能和步骤,包括学习的算法、工具等。向下发展(业务方向):可以探讨结合业务知识的具体领域ÿ…...
循环神经网络RNN原理与优化
目录 前言 RNN背景 RNN原理 上半部分:RNN结构及按时间线展开图 下半部分:RNN在不同时刻的网络连接和计算过程 LSTM RNN存在的问题 LSTM的结构与原理 数学表达层面 与RNN对比优势 应用场景拓展 从简易但严谨的代码来看RNN和LSTM RNN LSTM 前言 绕循环神经…...
Python正则表达式处理中日韩字符过滤全解析
Python正则表达式处理中日韩字符过滤全解析 一、核心原理:Unicode字符范围定位 中日韩字符在Unicode中的分布: 中文:\u4e00-\u9fff(基本区) \u3400-\u4dbf(扩展A区) \U00020000-\U0002a6df…...
Zabbix 7.2实操指南:基于OpenEuler系统安装Zabbix 7.2
原文出处:乐维社区 部署环境 openEuler 22.03 LTS PHP 8.0 Apache Mysql 8.0 MySQL数据库 6.0 以上版本需要安装mysql8.0以上版本的数据库(以mysql为例子)。 欧拉系统自带 mysql8.0 的源,无需要安装额外的源。 安装mysql …...
扩展阅读-Elasticsearch 通过索引阻塞实现数据保护深入解析
目录 前言 1、索引阻塞的种类 2、什么时候使用阻塞? 场景1:进行系统维护场景。 场景2:保护数据不被随意更改场景。 场景3:优化资源使用的场景。 场景4:遵守安全规则场景。 3、添加索引阻塞API 4、解除设置 AP…...
SpringMVC重定向接口,参数暴露在url中解决方案!RedirectAttributes
OK,首先描述下业务场景,终端数量限制登录 1.首先访问项目login的get接口 2.输入账号密码点击登录后,会请求login的POST接口 3.后台对终端数量逻辑处理不允许登录跳回到登录页面 4.因代码原因需在后台进行多次重定向接口,最后跳…...
硬件学习笔记--46 电能表影响量试验梳理
目录 1.电流和电压电路中的谐波影响试验 1)电流和电压电路中谐波——第5次谐波试验 2)电流和电压电路中谐波——方顶波波形试验 3)电流和电压电路中谐波——尖顶波波形试验 4)电流和电压电路中谐…...
大数据技术之HBase操作归纳
HBase基本命令总结表(实际操作方式) 进入Hbase:hbase shell 方式一:命令行窗口来操作HBase 1.通用性命令 version 版本信息 status 查看集群当前状态 whoami 查看登入者身份 help 帮助2.HBase DDL操作(对象级操作) 2.1、namespace命名空间(相当…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
