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

oracle稳定执行计划

二、稳定执行计划
(一)sql profile的好处
稳定执行计划
在不能修改目标sql的sql文本的情况下使目标sql语句按照指定的执行计划运行。
1、automatic类型的sql profile
本质是针对目标sql的一些额外的调整信息,这些额外的调整信息需要与原目标sql的相关统计信息等内容一起作用才能得到新的执行计划,即原始sql的统计信息等内容一旦发生变化,即使原有的automatic类型的sql profile并没有改变,该sql的执行计划也可能发生变化。
SQL> exec dbms_sqltune.accept_sql_profile(task_name =>'my_sql_tuning_task_4',task_owner =>'SCOTT',replace => TRUE,force_match=>true);
说明:
force_match=>true 相当于绑定变量


(1)t1表原本有索引idx_t1,使用hint让它不走索引
SQL> grant select on v_$session to scott;
SQL> grant select on v_$sql_plan_statistics_all to scott;
SQL> grant select on v_$sql_plan to scott;
SQL> connect scott/tiger; 
SQL> create table t1(n number);
SQL> declare
  2  begin
  3  for i in 1 .. 10000
  4  loop
  5  insert into t1 values(i);
  6  commit;
  7  end loop;
  8  end;
  9  /
SQL> select count(*) from t1;
  COUNT(*)
----------
     10000
SQL> create index idx_t1 on t1(n);
SQL> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',method_opt=>'for all columns size 1',CASCADE=>true);
SQL> select /*+ no_index(t1 idx_t1) */ * from t1 where n=1
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));

该执行计划会走全表扫描

(2)建立一个自动调整任务(my_sql_tuning_task_4)
SQL> declare
  2  my_task_name VARCHAR2(30);
  3  my_sqltext CLOB;
  4  begin
  5  my_sqltext := 'select /*+ no_index(t1 idx_t1) */ * from t1 where n=1';
  6  my_task_name := dbms_sqltune.create_tuning_task(
  7  sql_text => my_sqltext,
  8  user_name => 'SCOTT',
  9  scope => 'COMPREHENSIVE',
 10  time_limit => 60,
 11  task_name => 'my_sql_tuning_task_4',
 12  description => 'Task to tune a query on table t1');
 13   END;
 14  /
 

(备注:删除自动任务 : exec dbms_sqltune.drop_tuning_task('my_sql_tuning_task_4');

补充:删除sql_profile : exec dbms_sqltune.drop_sql_profile(name =>'my_sql_tuning_task_4');  


 (3)执行上述自动调整任务
 SQL> begin
  2  dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task_4');
  3  end;
  4  /
  
(4)查看该自动调整任务的结果确实走了索引。
SQL> set long 900
SQL> set longchunksize 1000
SQL> set linesize 800
SQL> select dbms_sqltune.report_tuning_task('my_sql_tuning_task_4') from dual;

 (5)接受这个sql profile
SQL> exec dbms_sqltune.accept_sql_profile(task_name =>'my_sql_tuning_task_4',task_owner =>'SCOTT',replace => TRUE,force_match=>true);

(补充:删除sql_profile : exec dbms_sqltune.drop_sql_profile(name =>'my_sql_tuning_task_4');  


 (6)接着再执行如下sql时会走索引
SQL> select /*+ no_index(t1 idx_t1) */ * from t1 where n=20
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));

2、manual类型的sql profile
本质是一堆hint的组合。这一堆hint的组合实际上来源于执行计划中outline data部分的hint组合。manual类型的sql profile可以起到很好的稳定目标sql的执行计划的作用。

使用脚本coe_xfr_sql_profile.sql针对目标sql生成manual类型的sql profile,并通过"偷梁换柱"的方式在不修改目标sql的sql文本的情况下调整其执行计划。
步骤如下:
(1)针对目标sql使用脚本coe_xfr_sql_profile.sql产生能生成其manual类型的sql profile的脚本A.
(2)改写目标sql的文本,在其中使用合适的hint,直到加入hint后的sql能走出我们想要的执行计划。然后对加入合适hint后的sql使用脚本coe_xfr_sql_profile.sql,产生能生成其manual类型的sql profile的脚本B
(3)用脚本B中的Outline Data部分的hint组合替换掉脚本A中的Outline Data部分的hint组合。
(4)执行脚本A生成针对原目标sql的manual类型的sql profile.
 
SQL> select /*+ no_index(t1 idx_t1) */ * from t1 where n=20;    
因为上一步automatic类型的sql profile使用了自动调整任务,所以该sql的执行计划会走索引
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
INDEX RANGE SCAN
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
   - SQL profile coe_gkdzg1fk71sc0_3617692013 used for this statement

删除sql profile
SQL> exec dbms_sqltune.drop_sql_profile('coe_gkdzg1fk71sc0_3617692013');

执行走索引的profile
SQL> select /*+ index(t1 idx_t1) */ * from t1 where n=20;
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
PLAN_TABLE_OUTPUT
SQL_ID    2a4g5h03mm877, child number 0
Plan hash value: 1369807930
|*  1 |  INDEX RANGE SCAN| IDX_T1 |    1 |    4 |    1   (0)| 00:00:01 |

SQL> col SQL_TEXT for a85
SQL> set pagesize 900;
SQL> set linesize 900;
SQL> select sql_text,sql_id,version_count from    v$sqlarea where sql_text like '%n=20%'
SQL_TEXT                                                                             SQL_ID         VERSION_COUNT
---------------------------------------------------------------------------------- ------------- -------------
select /*+ no_index(t1 idx_t1) */ * from t1 where n=20                                 fyrgtpxw26btv         1
select /*+ index(t1 idx_t1) */ * from t1 where n=20                                     2a4g5h03mm877         1
select sql_text,sql_id,version_count from v$sqlarea where sql_text like '%n=20%'     gtfnngky67bj6         1

原sql对应的plan_hash_value
SQL> select plan_hash_value from v$sql where sql_id='fyrgtpxw26btv';
PLAN_HASH_VALUE

     3617692013
加了强制索引的sql对应的plan_hash_value
SQL> select plan_hash_value from v$sql where sql_id='2a4g5h03mm877';
PLAN_HASH_VALUE
---------------
     1369807930


针对原sql使用脚本coe_xfr_sql_profile.sql产生能生产其manual类型sql profile脚本。
SQL> @?/rdbms/admin/coe_xfr_sql_profile.sql;   (oracle官方文档ID 215187.1)
Parameter 1:
SQL_ID (required)
Enter value for 1: fyrgtpxw26btv
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
     3617692013        .006
Parameter 2:
PLAN_HASH_VALUE (required)
Enter value for 2: 3617692013
Values passed to coe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID           : "fyrgtpxw26btv"
PLAN_HASH_VALUE: "3617692013"
SQL>BEGIN
  2    IF :sql_text IS NULL THEN
  3       RAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for SQL_ID &&sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');
  4    END IF;
  5  END;
  6  /
SQL>SET TERM OFF;
SQL>BEGIN
  2    IF :other_xml IS NULL THEN
  3       RAISE_APPLICATION_ERROR(-20101, 'PLAN for SQL_ID &&sql_id. and PHV &&plan_hash_value. was not found in memory (gv$sql_plan) or AWR (dba_hist_sql_plan).');
  4    END IF;
  5  END;
  6  /
SQL>SET TERM OFF;
Execute coe_xfr_sql_profile_fyrgtpxw26btv_3617692013.sql
on TARGET system in order to create a custom SQL Profile
with plan 3617692013 linked to adjusted sql_text.
COE_XFR_SQL_PROFILE completed.
SQL>

针对强制索引的sqlsql使用脚本coe_xfr_sql_profile.sql产生能生产其manual类型sql profile脚本。
SQL>@?/rdbms/admin/coe_xfr_sql_profile.sql;
Parameter 1:
SQL_ID (required)
Enter value for 1: 2a4g5h03mm877
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
     1369807930        .007
Parameter 2:
PLAN_HASH_VALUE (required)
Enter value for 2: 1369807930
Values passed to coe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID           : "2a4g5h03mm877"
PLAN_HASH_VALUE: "1369807930"
SQL>BEGIN
  2    IF :sql_text IS NULL THEN
  3       RAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for SQL_ID &&sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');
  4    END IF;
  5  END;
  6  /
SQL>SET TERM OFF;
SQL>BEGIN
  2    IF :other_xml IS NULL THEN
  3       RAISE_APPLICATION_ERROR(-20101, 'PLAN for SQL_ID &&sql_id. and PHV &&plan_hash_value. was not found in memory (gv$sql_plan) or AWR (dba_hist_sql_plan).');
  4    END IF;
  5  END;
  6  /
SQL>SET TERM OFF;
Execute coe_xfr_sql_profile_2a4g5h03mm877_1369807930.sql
on TARGET system in order to create a custom SQL Profile
with plan 1369807930 linked to adjusted sql_text.
COE_XFR_SQL_PROFILE completed.
SQL>

参考coe_xfr_sql_profile_2a4g5h03mm877_1369807930.sql修改coe_xfr_sql_profile_fyrgtpxw26btv_3617692013.sql脚本内容,再执行coe_xfr_sql_profile_fyrgtpxw26btv_3617692013.sql脚本

h := SYS.SQLPROF_ATTR(
q'[BEGIN_OUTLINE_DATA]',
q'[IGNORE_OPTIM_EMBEDDED_HINTS]',
q'[OPTIMIZER_FEATURES_ENABLE('12.1.0.2')]',
q'[DB_VERSION('12.1.0.2')]',
q'[ALL_ROWS]',
q'[OUTLINE_LEAF(@"SEL$1")]',
q'[FULL(@"SEL$1" "T1"@"SEL$1")]',
q'[END_OUTLINE_DATA]');

改为
h := SYS.SQLPROF_ATTR(
q'[BEGIN_OUTLINE_DATA]',
q'[IGNORE_OPTIM_EMBEDDED_HINTS]',
q'[OPTIMIZER_FEATURES_ENABLE('12.1.0.2')]',
q'[DB_VERSION('12.1.0.2')]',
q'[ALL_ROWS]',
q'[OUTLINE_LEAF(@"SEL$1")]',
q'[INDEX(@"SEL$1" "T1"@"SEL$1" ("T1"."N"))]',
q'[END_OUTLINE_DATA]');


force_match=FALSE
改为
force_match=TRUE

执行coe_xfr_sql_profile_fyrgtpxw26btv_3617692013.sql脚本
SQL> @coe_xfr_sql_profile_fyrgtpxw26btv_3617692013.sql
SQL> connect scott/tiger;
Connected.

( 补充:删除sql_profile : exec DBMS_SQLTUNE.DROP_SQL_PROFILE(name =>'my_sql_tuning_task_4');    )

最后可以走索引。
SQL>  select /*+ no_index(t1 idx_t1) */ * from t1 where n=20;
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
|*  1 |  INDEX RANGE SCAN| IDX_T1 |    1 |    4 |    1   (0)| 00:00:01 |

二、spm稳定执行计划
oracle 11g以及以上版本上,有如下2种方法产生目标sql的sql plan baseline:
自动捕获:
手工生成/批量导入(批量导入尤其适用于oracle数据库大版本升级,它可以确保升级后原有系统所有的sql的执行计划不会发生改变)

手工生成单个sql plan baseline的步骤
(1)针对目标sql使用dbms_spm.load_plans_from_cursor_cache手工生成其初始执行计划所对应的sql plan baseline,此时,使用dbms_spm.load_plans_from_cursor_cache传入的参数为:
dbms.spm.load_plans_from_cursor_cache
(
sql_id => '原目标sql的sql_id',
plan_hash_value =>'原目标sql的plan hash value'
)
(2)改写目标sql的sql文本,在其中加入合适的hint,直到加入hint后的所该写的sql能走出我们想要的执行计划,然后对改写后的sql使用dbms_spm.load_plans_from_cursor_cache手工生成新的执行计划所对应的sql plan baseline.此时,使用dbms_spm.load_plans_from_cursor_cache传入的参数为如下所示:
dbms.spm.load_plans_from_cursor_cache
(
sql_id => '加入合适hint后的改写sql的sql_id',
plan_hash_value =>'加入合适hint后的改写sql的plan hash value',
sql_handle=>'原目标sql在步骤(1)中所产生的sql plan baseline的sql_handle'
)
(3)使用dbms_spm.drop_sql_plan_baseline删除步骤(1)中手工生成的原目标sql的初始执行计划所对应的sql plan baseline.此时,使用dbms_spm.drop_sql_plan_baseline传入的参数为如下所示:
dbms_spm.drop_sql_plan_baseline
(
sql_handle=>'原目标sql在步骤(1)中所产生的sql plan baseline的sql_handle',
plan_name=>'原目标sql在步骤(1)中所产生的sql plan baseline的plan_name'
)

var temp varchar2(10000);
exec:temp:=dbms_spm.drop_sql_plan_baseline(sql_handle=>'SQL_75b06ae056223f5f',plan_name=>'SQL_PLAN_7bc3aw1b24guzb55f43d8');
exec:temp:=dbms_spm.drop_sql_plan_baseline(sql_handle=>'SQL_75b06ae056223f5f',plan_name=>'SQL_PLAN_7bc3aw1b24guzb860bcf2');

创建测试表,建立索引,收集统计信息,执行查询
SQL> create table t2 as select * from dba_objects;
SQL> create index idx_t2 on t2(object_id);
SQL> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T2',estimate_percent=>100,cascade=>true);
SQL> select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4;
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
SQL_ID    76td2qkxcrn9v, child number 0
Plan hash value: 1513984157
|*  1 |  TABLE ACCESS FULL| T2     |     1 |    30 |   430   (1)| 00:00:01 |
--------------------------------------------------------------------------

没有开启sql_plan_baseline自动捕获,所以没有sql_plan_baseline
SQL> set pagesize 900;
SQL> set linesize 900;
SQL> col PLAN_NAME for a30;
SQL> col SQL_HANDLE for a25;
SQL> col SQL_TEXT for a80;
SQL> select sql_handle,plan_name,origin,enabled,accepted,sql_text from dba_sql_plan_baselines where sql_text like 'select /*+ no_index(t2 idx_t2) */object%';
no rows selected
SQL> 

(1)
使用目标sql的初始执行计划(即对T2表的全表扫描)所对应的sql id 和plan hash_value 来手工生成对应的sql plan baseline
SQL > var temp number;
SQL> exec :temp := dbms_spm.load_plans_from_cursor_cache(sql_id =>'76td2qkxcrn9v',plan_hash_value=>1513984157);
PL/SQL procedure successfully completed
SQL> select sql_handle,plan_name,origin,enabled,accepted,sql_text from dba_sql_plan_baselines where sql_text like 'select /*+ no_index(t2 idx_t2) */object%';
SQL_HANDLE          PLAN_NAME             ORIGIN     ENA ACC SQL_TEXT
------------------------- ------------------------------ -------------- --- --- --------------------------------------------------------------------------------
SQL_75b06ae056223f5f      SQL_PLAN_7bc3aw1b24guzb860bcf2 MANUAL-LOAD    YES YES select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4
SQL> 

改写目标sql,强制索引hint
SQL> select /*+ index(t2 idx_t2) */object_name,object_id from t2 where object_id=4;
SQL>  select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
SQL_ID    795jg57h9tryx, child number 0
Plan hash value: 1306670842
|*  2 |   INDEX RANGE SCAN            | IDX_T2 |       1 |         |       1   (0)| 00:00:01 |

原目标sql现在依然只有其原执行计划(即对T2表的全表扫描)所对应的sql plan baseline
SQL> select sql_handle,plan_name,origin,enabled,accepted,sql_text from dba_sql_plan_baselines where sql_text like 'select /*+ no_index(t2 idx_t2) */object%';
SQL_HANDLE          PLAN_NAME             ORIGIN     ENA ACC SQL_TEXT
------------------------- ------------------------------ -------------- --- --- --------------------------------------------------------------------------------
SQL_75b06ae056223f5f      SQL_PLAN_7bc3aw1b24guzb860bcf2 MANUAL-LOAD    YES YES select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4
SQL>

(2)
使用改写后的sql的新执行计划(强制索引hint)所对应的sql id 和plan hash_value 以及原目标sql的sql plan baseline的sql_handle来手工生成对应的sql plan baseline
SQL> exec :temp :=dbms_spm.load_plans_from_cursor_cache(sql_id =>'795jg57h9tryx',plan_hash_value=>1306670842,sql_handle=>'SQL_75b06ae056223f5f');
SQL> select sql_handle,plan_name,origin,enabled,accepted,sql_text from dba_sql_plan_baselines where sql_text like 'select /*+ no_index(t2 idx_t2) */object%';
SQL_HANDLE          PLAN_NAME             ORIGIN     ENA ACC SQL_TEXT
------------------------- ------------------------------ -------------- --- --- --------------------------------------------------------------------------------
SQL_75b06ae056223f5f      SQL_PLAN_7bc3aw1b24guzb55f43d8 MANUAL-LOAD    YES YES select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4
SQL_75b06ae056223f5f      SQL_PLAN_7bc3aw1b24guzb860bcf2 MANUAL-LOAD    YES YES select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4
SQL> 


(3)
drop 掉原执行计划(即对T2表的全表扫描)所对应的sql plan baseline
SQL> exec:temp:=dbms_spm.drop_sql_plan_baseline(sql_handle=>'SQL_75b06ae056223f5f',plan_name=>'SQL_PLAN_7bc3aw1b24guzb860bcf2');
SQL> select sql_handle,plan_name,origin,enabled,accepted,sql_text from dba_sql_plan_baselines where sql_text like 'select /*+ no_index(t2 idx_t2) */object%';
SQL_HANDLE          PLAN_NAME             ORIGIN     ENA ACC SQL_TEXT
------------------------- ------------------------------ -------------- --- --- --------------------------------------------------------------------------------
SQL_75b06ae056223f5f      SQL_PLAN_7bc3aw1b24guzb55f43d8 MANUAL-LOAD    YES YES select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4
SQL> 

再次执行原目标sql
SQL> select /*+ no_index(t2 idx_t2) */object_name,object_id from t2 where object_id=4;
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
SQL_ID    76td2qkxcrn9v, child number 1
Plan hash value: 1306670842
|*  2 |   INDEX RANGE SCAN            | IDX_T2 |       1 |         |       1   (0)| 00:00:01 |
Note
   - SQL plan baseline SQL_PLAN_7bc3aw1b24guzb55f43d8 used for this statement
 

相关文章:

oracle稳定执行计划

二、稳定执行计划 (一)sql profile的好处 稳定执行计划 在不能修改目标sql的sql文本的情况下使目标sql语句按照指定的执行计划运行。 1、automatic类型的sql profile 本质是针对目标sql的一些额外的调整信息,这些额外的调整信息需要与原目标s…...

docker安装neo4j

参考文章: 1、Mac 本地以 docker 方式配置 neo4j_neo4j mac docker_Abandon_first的博客-CSDN博客 2、https://www.cnblogs.com/caoyusang/p/13610408.html 安装的时候,参考了以上文章。遇到了一些问题,记录下自己的安装过程: …...

第十五章 定义 HL7 的 DTL 数据转换

文章目录 第十五章 定义 HL7 的 DTL 数据转换 第十五章 定义 HL7 的 DTL 数据转换 每个接口可能需要一定数量的数据转换。创建转换时,不要使用保留的包名称。 重要提示:请勿在数据转换中手动更改 HL7 转义序列;自动处理这些。 可以使用“数…...

【笔记】移动光猫改桥接

1. 登录后台 移动光猫的超管和密码(百度的) 账号:CMCCAdmin 密码:aDm8H%MdA 浏览器访问 192.168.1.1 并登录 2. 选择连接 点击“网络”,在“连接名称”下拉框选择 INTENET_R_VID 字样的连接,并截图备…...

网络安全进阶学习第十四课——MSSQL注入

文章目录 一、MSsql数据库二、MSsql结构三、MSsql重点表1、master 数据库中的Sysdatabases 表2、Sysobjects 表3、Syscolumns 表 四、Mssql常用函数五、Mssql的报错注入六、Mssql的盲注常用以下函数进行盲注: 七、联合注入1、获取当前表的列数2、获取当前数据库名3、…...

【C语言】初阶结构体

🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:C语言初阶 ✨其他专栏:代码小游戏 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论…...

24届近5年南京理工大学自动化考研院校分析

今天学长给大家带来的是南京理工大学控制考研分析 满满干货~还不快快点赞收藏 一、南京理工大学 ​ 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学,学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院&#xf…...

5.PyCharm基础使用及快捷键

在前几篇文章中介绍了PyCharm的安装和汉化,本篇文章一起来看一下PyCharm的基本用法和一些快捷键的使用方法。 本篇文章PyCharm的版本为PyCharm2023.2 新建项目和运行 打开工具,在菜单中——文件——新建项目 选择项目的创建位置(注意最好不要使用中文路径和中文名项目名称…...

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本:otp_win64_23.2 rabbitmq-server-3.8.16 版本说明:https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…...

GPU版PyTorch对应安装教程

一、正确安装符合自己电脑的对应GPU版本的PyTorch之前需要了解三个基本概念 算力、CUDA driver version、CUDA runtime version ①算力:需要先知道你的显卡,之后根据官网表格进行对应,得到算力 ②CUDA driver version:电脑上显卡…...

医学影像PACS临床信息系统源码

医学影像临床信息系统(Picture Archiving and Communication Systems)PACS是指从医疗影像设备中获得数字影像,利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统,能实现影像数字化、无胶片化管理。 登记系统 …...

Python(Web时代)——jinja2模板

简介 Jinja2是Flask框架默认支持的模板引擎,是python的web项目中被广泛应用的一种模板引擎,jinja2的作者与Flask是同一个人。 jinja2具有以下特点: 非常灵活,提供了控制结构、表达式与继承等 性能好 可读性强 渲染一个模板&a…...

酷开系统 | 酷开科技,让数据变得更有价值!

身处信息时代,我们每个人时刻都在生成、传递和应用数据,数据已经成为了现代社会中宝贵的资源之一,而在人工智能领域,数据更是被称为人工智能的“燃料”。 而在AI的发展中,只有拥有高质量、多样性且充分代表性的数据集…...

uni——tab切换

案例展示 案例代码 <view class"tablist"><block v-for"(item,index) in tabList" :key"index"><view class"tabItem" :class"current item.id?active:" click"changeTab(item)">{{item.nam…...

类图的6种关系和golang应用

文章目录 1. 依赖和关联1.1 依赖&#xff08;Dependency&#xff09;概念类图示例代码示例 1.2 关联&#xff08;Association&#xff09;概念类图示例代码示例 2. 组合和聚合&#xff08;特殊的关联关系&#xff09;2.1 聚合&#xff08;Aggregation&#xff09;概念类图示例代…...

Linux tar 备忘清单

tar 备忘清单 语法选项创建一个 tar 格式的压缩文件创建压缩后的 tar.gz 存档文件生成压缩率更高的 tar.bz2 文件解压缩 tar 文件解压缩 tar.gz 文件解压缩 tar.bz2 文件列出归档内容从 tar 归档文件中提取单个文件从 tar 归档文件中提取多个文件使用通配符提取文件组添加文件或…...

76. 最小覆盖子串

题目链接&#xff1a;力扣 解题思路&#xff1a;滑动窗口 因为只需要最小子串中包含t中的所有字符即可&#xff0c;顺序不重要&#xff0c;所以可以先统计一下 t 中每个字符出现的次数&#xff0c;使用map进行统计&#xff1a; key表示t中的字符&#xff0c;value表示字符的个…...

科兴未来|2023“数智未来,聚放神采”医疗科技创新挑战赛

一、赛事亮点 聚焦前沿神经科学与脑科学领域 展示优质创新产品、技术、平台与服务 汇聚学术端、产业端、投资端多维专业视角 搭建合作交流、产业赋能与生态融合平台 共话行业发展方向与动态趋势 二、赛事简介 2023医疗科技创新挑战赛聚焦于神经科学及脑科学领域的前沿技…...

第56步 深度学习图像识别:CNN梯度权重类激活映射(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 类激活映射&#xff08;Class Activation Mapping&#xff0c;CAM&#xff09;和梯度权重类激活映射&#xff08;Gradient-weighted Class Activation Mapping&#xff0c;Grad-CAM&#xff09;是两种可视化深度学习模型决策过程的技术…...

云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步&#xff0c;但风电、光伏发电间歌性、波动性强&#xff0c;电网消纳压力较大&#xff0c;且电…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...