当前位置: 首页 > news >正文

自适应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)版本中&#xff0c;引入了对SQL计划管理&#xff08;SPM&#xff09;功能的增强&#xff0c;特别是关于SQL计划基线的自动进化机制。这一改进允许数据库更加智能地管理和优化SQL查询的执行计划&#xff0c;确保即使数据分布发生变化&…...

什么是DeFi (去中心化金融)

DeFi (去中心化金融) 概述 &#x1f4b0; 1. DeFi 基础概念 1.1 什么是 DeFi&#xff1f; DeFi 是建立在区块链上的金融服务生态系统&#xff0c;它&#xff1a; 无需中心化中介开放且透明无需许可即可参与代码即法律 1.2 DeFi 的优势 开放性&#xff1a;任何人都可以参与…...

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly

Arxiv日期&#xff1a;2024.2.14机构&#xff1a;Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论&#xff1a;十进制加法任务上的长度泛化最佳组合&#xff1a; FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…...

SpringAI做对了什么

开发&#xff5c;界面&#xff5c;引擎&#xff5c;交付&#xff5c;副驾——重写全栈法则&#xff1a;AI原生的倍速造应用流 你好&#xff0c;这里是nine[谈架构]系列。 欢迎关注评论私信交流~ SpringAI 在 AI 编程领域延续了Spring的诸多优势&#xff0c;从易于集成、到通用…...

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的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 路由系统是其核心组件之一&#xff0c;它负责将用户的 HTTP 请求&#xff08;即 URL&#xff09;映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时&#xff0c;Django 会根据项目的 URL 配置文件&#xff08;urls.py&#…...

Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路

一、资料快车 1、深入了解Android输入系统&#xff1a;https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考&#xff1a; 2、系统程序分析方法 1&#xff09;加入log&#xff0c;并跟着log一步步分析 -logc…...

Java中Map循环安全的删除数据的4中方法

文章目录 前言一、使用Iterator删除二、使用 removeIf&#xff08;Java 8&#xff09;三、遍历时记录需要删除的键&#xff08;不推荐&#xff09;四、使用 Stream&#xff08;Java 8&#xff09;总结 前言 在 Java 中&#xff0c;遍历 HashMap 并删除数据时&#xff0c;直接使…...

蓝桥杯(B组)-每日一题(1093字符逆序)

c中函数&#xff1a; reverse(首位置&#xff0c;尾位置&#xff09; reverse(s.begin(),s.end()) 头文件&#xff1a;<algorithm> #include<iostream> #include<algorithm>//运用reverse函数的头文件 using namespace std; int main() {string s;//定义一…...

【数据分析】3 数据分析成长之路

职业发展路径&#xff1a; 向上发展&#xff08;技术方向&#xff09;&#xff1a;可以详细说明成为数据科学家或专家所需的具体技能和步骤&#xff0c;包括学习的算法、工具等。向下发展&#xff08;业务方向&#xff09;&#xff1a;可以探讨结合业务知识的具体领域&#xff…...

循环神经网络RNN原理与优化

目录 前言 RNN背景 RNN原理 上半部分&#xff1a;RNN结构及按时间线展开图 下半部分&#xff1a;RNN在不同时刻的网络连接和计算过程 LSTM RNN存在的问题 LSTM的结构与原理 数学表达层面 与RNN对比优势 应用场景拓展 从简易但严谨的代码来看RNN和LSTM RNN LSTM 前言 绕循环神经…...

Python正则表达式处理中日韩字符过滤全解析

Python正则表达式处理中日韩字符过滤全解析 一、核心原理&#xff1a;Unicode字符范围定位 中日韩字符在Unicode中的分布&#xff1a; 中文&#xff1a;\u4e00-\u9fff&#xff08;基本区&#xff09; \u3400-\u4dbf&#xff08;扩展A区&#xff09; \U00020000-\U0002a6df…...

Zabbix 7.2实操指南:基于OpenEuler系统安装Zabbix 7.2

原文出处&#xff1a;乐维社区 部署环境 openEuler 22.03 LTS PHP 8.0 Apache Mysql 8.0 MySQL数据库 6.0 以上版本需要安装mysql8.0以上版本的数据库&#xff08;以mysql为例子&#xff09;。 欧拉系统自带 mysql8.0 的源&#xff0c;无需要安装额外的源。 安装mysql …...

扩展阅读-Elasticsearch 通过索引阻塞实现数据保护深入解析

目录 前言 1、索引阻塞的种类 2、什么时候使用阻塞&#xff1f; 场景1&#xff1a;进行系统维护场景。 场景2&#xff1a;保护数据不被随意更改场景。 场景3&#xff1a;优化资源使用的场景。 场景4&#xff1a;遵守安全规则场景。 3、添加索引阻塞API 4、解除设置 AP…...

SpringMVC重定向接口,参数暴露在url中解决方案!RedirectAttributes

OK&#xff0c;首先描述下业务场景&#xff0c;终端数量限制登录 1.首先访问项目login的get接口 2.输入账号密码点击登录后&#xff0c;会请求login的POST接口 3.后台对终端数量逻辑处理不允许登录跳回到登录页面 4.因代码原因需在后台进行多次重定向接口&#xff0c;最后跳…...

硬件学习笔记--46 电能表影响量试验梳理

目录 1.电流和电压电路中的谐波影响试验 1&#xff09;电流和电压电路中谐波——第5次谐波试验 2&#xff09;电流和电压电路中谐波——方顶波波形试验 3&#xff09;​​​​​​​电流和电压电路中谐波——尖顶波波形试验 4&#xff09;​​​​​​​电流和电压电路中谐…...

大数据技术之HBase操作归纳

HBase基本命令总结表(实际操作方式) 进入Hbase&#xff1a;hbase shell 方式一&#xff1a;命令行窗口来操作HBase 1.通用性命令 version 版本信息 status 查看集群当前状态 whoami 查看登入者身份 help 帮助2.HBase DDL操作(对象级操作) 2.1、namespace命名空间(相当…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...