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
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Telerik UI for ASP.NET Core Crack

Telerik UI for ASP.NET Core Crack Telerik ASP.NET Core还包括MVC和Kendo UI捆绑包(用于JavaScript)、Figma的设计工具包以及文档处理库、用于ASP.NET Core的Telerik REPL、RTL支持、辅助功能和键盘导航、主题化、虚拟课堂培训、详细文档、演示、KBs和世界级支持。使用一整套…

Kali 安装好后的初始化配置

1.国内换源 sudo vim /etc/apt/sources.list#阿里云 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main …

Android开源 Skeleton 骨架屏

目录 一、简介 二、效果图 三、引用 Skeleton 添加jitpack 仓库 添加依赖: 四、使用 Skeleton 1、VIew 骨架屏使用 ViewSkeletonScreen 2、列表类View 骨架屏 RecyclerViewSkeletonScreen、GridViewSkeletonScreen、 ListViewSkeletonScreen 一、简介 骨架屏的作用是…

Golang 中的 unsafe 包详解

Golang 中的 unsafe 包用于在运行时进行低级别的操作。这些操作通常是不安全的,因为可以打破 Golang 的类型安全性和内存安全性,使用 unsafe 包的程序可能会影响可移植性和兼容性。接下来看下 unsafe 包中的类型和函数。 unsafe.Pointer 类型 通常用于…

什么是DNS的缓存?

DNS 缓存是一个临时的数据库,存储在计算机或网络设备(如路由器)上,用于保存最近的 DNS 查询结果。这种缓存机制可以加速后续的相同查询,因为设备可以直接从缓存中提取先前的查询结果,而不需要再次到外部的 …

操作系统 -- 进程间通信

一、概述 进程经常需要与其他进程通信。例如,在一个shell管道中,第一个进程的输出必须传送给第二个进程,这样沿着管道传递下去。因此在进程之间需要通信,而且最好使用一种结构良好的方式,不要使用中断。在下面几节中&…

GPU虚拟化理解包含直通,k8s安装,GPU-manager

什么是VGPU? vGPU,即真正意义上的GPU虚拟化方案,就是将一块GPU卡的计算能力进行切片,分成多个逻辑上虚拟的GPU,以vGPU为单位分配GPU的计算能力, 并将单块GPU卡分配给多台虚拟机使用,使得虚拟机能够运行3D…

日常开发中Git命令指北

Git基本操作 创建化仓库 mkdir 目录 cd 目录 git init配置本地仓库 # 配置用户名,邮箱 git config user.name "cxf" git config user.email "1969612859qq.com" # 查看本地配置(小写的 L) git config -l # 重置配置&a…

Linux下 时间戳的转化

Linux下一般用date 记录当前时间,尤其是我们需要保存测试log的时候,或者设计一个跑多长时间的脚本都需要时间戳。下面看一下平时最常用的几种写法 1 date “%Y-%m-%d %H:%M” 显示具体时间 2 修改时间 date -s 3 date %s :当前时间的时间戳 显示具体时…

远程通信-RPC

项目场景: 在分布式微服务架构中,远程通信是最基本的需求。 常见的远程通信方式,有基于 REST 架构的 HTTP协议、RPC 框架。 下面,从三个维度了解一下 RPC。 1、什么是远程调用 2、什么是 RPC 3、RPC 的运用场景和优 什么是远程调用…

【效率提升-Perl脚本】根据Verilog文件自动生成tb文件

文章目录 Verilog端口文件(仅做示范用)对应的tb文件相应代码 在数字IC设计过程中,根据顶层生成testbench时存在很多重复性工作,因此为了提高工作效率,特地开发此脚本。 相应的python脚本见链接: 【效率提升…

单机游戏防破解方案解析

近年来,游戏市场用户规模趋于稳定,游戏市场进入了存量时代,各赛道“人满为患”,如何在一片红海中站稳脚跟成了厂商的必修课。 而在快节奏的社会环境下,脱离了网游社交粘性,主打清爽、自由的单机游戏&#…

Java训练六

目录 一、除数不能为0 二、校验年龄格式 三、终端循环 四、 计算最大公约数 一、除数不能为0 使用静态变量、静态方法以及throws关键字,实现当两个数相除且除数为0时,程序会捕获并处理抛出的ArithmeticException异常(算术异常&#xff09…

合宙Air724UG LuatOS-Air script lib API--socket

Table of Contents socket socket.isReady() socket.tcp(ssl, cert, tCoreExtPara) socket.udp() socket.setTcpResendPara(retryCnt, retryMaxTimeout) socket.setDnsParsePara(retryCnt, retryTimeoutMulti) socket.printStatus() socket.setLowPower™ socket 模块功能&…

动手学深度学习(三)线性神经网络—softmax回归

分类任务是对离散变量预测,通过比较分类的概率来判断预测的结果。 softmax回归和线性回归一样也是将输入特征与权重做线性叠加,但是softmax回归的输出值个数等于标签中的类别数,这样就可以用于预测分类问题。 分类问题和线性回归的区别&#…

[YAPI]导出API文档

1.登录点击进去,点击项目2.点击接口,点击编辑,划到最下面,开启开放接口3.点击数据管理, 选择你要的数据导出格式,点击公开接口, 导出完别忘记关闭,防止别人导的时候将你开启的 也一并下载下来

opencv 基础54-利用形状场景算法比较轮廓-cv2.createShapeContextDistanceExtractor()

注意:新版本的opencv 4 已经没有这个函数 cv2.createShapeContextDistanceExtractor() 形状场景算法是一种用于比较轮廓或形状的方法。这种算法通常用于计算两个形状之间的相似性或差异性,以及找到最佳的匹配方式。 下面是一种基本的比较轮廓的流程&…

点的复合运动

一、问题所在 对于复合运动中的牵连运动一直很蒙,之前做题的时候都是靠经验,比如圆盘选择圆心做动系原点、连杆选择牵连点做原点等,今天重新整理了一下。 牵连运动的定义是动系相对于定系的运动,这个定义就很模糊。如果是指动系…

调整项目符号/项目编号与文本的距离

百度知道多年前的答案是调整标尺,我的PPT里没有标尺 调节悬挂缩进即可

flutter开发实战-实现左右来回移动的按钮引导动画效果

flutter开发实战-实现左右来回移动的按钮引导动画效果 最近开发过程中需要实现左右来回移动的按钮引导动画效果 一、动画 AnimationController用来控制一个或者多个动画的正向、反向、停止等相关动画操作。在默认情况下AnimationController是按照线性进行动画播放的。Animati…