使用sql profile 稳定执行计划的案例
文章目录
- 1.缘起
- 2.变慢的sql
- 3.检查瓶颈
- 4.解决办法
- 4.1 SQLTXPLAIN 也称为 SQLT
- 4.11 下载coe_xfr_sql_profile.sql
- 4.12 使用方法
- 4.13 执行coe_xfr_sql_profile.sql
- 4.14 执行coe_xfr_sql_profile.sql产生的sql profile文件
- 4.15 验证
- 4.2 SQL Tuning Advisor方式
- 4.21 第一次Tuning task
- 4.22 输出第一次报告
- 4.23 执行报告建议部分
- 4.24 第二次tunning task
- 4.25 输出第二次报告
- 4.26 绑定执行计划
- 4.27 验证
1.缘起
接上次一次hard parse处理过程
自从为了解决hard parse的问题而设置了cursor_sharing=force后,又衍生了其他的问题,那就是执行计划的稳定性,如下记录发生的一起强制绑定变量后引起的执行计划绑定的问题
2.变慢的sql
用戶反映早上接数据变得很慢,使用如下sql检查该时段最频繁的sql
select SQL_ID,COUNT(1) from dba_hist_active_sess_history where to_char(sample_time,'YYYY-MM-DD HH24') LIKE '2023-09-07 07%'
GROUP BY SQL_ID order by count(1) desc
SQL_ID COUNT(1)
--------- ---------
b9vfj9nfx8h96 343null 190
0dkf5ub9b50qz 189
5axg9sxr2hqzv 82
b2fmuanq720cn 59
ffsffxdmg6987 48
8pmcn7r4jak0b 38
d1hzqrwah70hv 27
by3ykxt3p3qv6 23
34jhhpgabascc 17
在跟系统维运人员确认,肇事的sql就是:
SELECT * FROM DBA_HIST_SQLTEXT WHERE SQL_ID='b9vfj9nfx8h96'
SQL_ID SQL_TEXT
------------- ----------------------------------------------------------------------
b9vfj9nfx8h96 "INSERT INTO VIE_BU_IN_EM_CARD_RECORD (FACT_NO, PNL_NO, CARD_DATE,CARD_TM, SEQ_NO, MAR_NO, ADD_NAME, ADD_DATE, UPD_NAME, UPD_DATE, SOURCE_MK, FACT_NO1, PNL_NO1)
select FACT_NO, PNL_NO, CARD_DATE,CARD_TM, SEQ_NO, MAR_NO, ADD_NAME, TO_CHAR(SYSDATE, :"SYS_B_0") ADD_DATE, UPD_NAME, UPD_DATE, SOURCE_MK, FACT_NO1, PNL_NO1FROM TMP_VIE_BU_IN_EM_CARD_RECORD awhere not exists(select :"SYS_B_1" from VIE_BU_IN_EM_CARD_RECORD b where a.fact_no1 = b.fact_no1 and a.pnl_no = b.pnl_no and a.card_date = b.card_date and a.card_tm = b.card_tm and b.card_date BETWEEN TO_CHAR(SYSDATE -:"SYS_B_2", :"SYS_B_3") AND TO_CHAR(SYSDATE, :"SYS_B_4"))"
3.检查瓶颈
可以看没有"WAITING",全部"ON CPU"
select session_state,count(*) from dba_hist_active_sess_history where to_char(sample_time,'YYYY-MM-DD HH24') LIKE '2023-09-07 07%' AND SQL_ID='b9vfj9nfx8h96'
group by session_state
SESSION COUNT(*)
------- ----------
ON CPU 343
确认运行时的执行计划
该时段仅3个session运行这条sql,并且使用相同的执行计划
select session_id,sql_id,sql_plan_hash_value,count(1) from dba_hist_active_sess_history where to_char(sample_time,'YYYY-MM-DD HH24') LIKE '2023-09-07 07%' AND SQL_ID='b9vfj9nfx8h96'
group by session_id,sql_id,sql_plan_hash_value
SESSION_ID SQL_ID SQL_PLAN_HASH_VALUE COUNT(1)
---------- ------------- ------------------- ----------393 b9vfj9nfx8h96 3318088377 53460 b9vfj9nfx8h96 3318088377 97656 b9vfj9nfx8h96 3318088377 193
查看执行计划细节
可以看到这条sql有2个执行计划,sql却选择了比较高价的那个执行计划
究其原因,猜想应该是设定cursor_sharing=force之前,此sql执行一次分析一次,所以会比较精准的执行计划,而设定为force后,sql似乎与绑定了比较高价的执行计划
select sql_id,plan_hash_value,id,cost,operation,options,object#,object_owner,object_name,object_type
from dba_hist_sql_plan where sql_id='b9vfj9nfx8h96' --and plan_hash_value=3318088377
order by sql_id,plan_hash_value,id
SQL_ID PLAN_HASH_VALUE ID COST OPERATION OPTIONS OBJECT# OBJECT_OWNER OBJECT_NAME OBJECT_TYPE
------------- --------------- ---------- ---------- ------------------------- -------------------- ---------- -------------------- ------------------------------ --------------------
b9vfj9nfx8h96 1009235934 0 34 INSERT STATEMENT
b9vfj9nfx8h96 1009235934 1 34 HASH JOIN ANTI
b9vfj9nfx8h96 1009235934 2 2 TABLE ACCESS FULL 242122 CARD2HRIS TMP_VIE_BU_IN_EM_CARD_RECORD TABLE (TEMP)
b9vfj9nfx8h96 1009235934 3 31 VIEW VW_SQ_1 VIEW
b9vfj9nfx8h96 1009235934 4 31 NESTED LOOPS
b9vfj9nfx8h96 1009235934 5 31 TABLE ACCESS BY INDEX ROWID 189258 IDHRIS EM_CARD_RECORD TABLE
b9vfj9nfx8h96 1009235934 6 5 INDEX RANGE SCAN 276465 IDHRIS IDX_ADD_DATE INDEX
b9vfj9nfx8h96 1009235934 7 0 INDEX UNIQUE SCAN 61593 IDHRIS PK_SYS_DATA_PERMISSION INDEX (UNIQUE)
b9vfj9nfx8h96 3318088377 0 615 INSERT STATEMENT
b9vfj9nfx8h96 3318088377 1 FILTER
b9vfj9nfx8h96 3318088377 2 2 TABLE ACCESS FULL 242122 CARD2HRIS TMP_VIE_BU_IN_EM_CARD_RECORD TABLE (TEMP)SQL_ID PLAN_HASH_VALUE ID COST OPERATION OPTIONS OBJECT# OBJECT_OWNER OBJECT_NAME OBJECT_TYPE
------------- --------------- ---------- ---------- ------------------------- -------------------- ---------- -------------------- ------------------------------ --------------------
b9vfj9nfx8h96 3318088377 3 613 NESTED LOOPS
b9vfj9nfx8h96 3318088377 4 1 INDEX UNIQUE SCAN 61593 IDHRIS PK_SYS_DATA_PERMISSION INDEX (UNIQUE)
b9vfj9nfx8h96 3318088377 5 612 TABLE ACCESS BY INDEX ROWID 189258 IDHRIS EM_CARD_RECORD TABLE
b9vfj9nfx8h96 3318088377 6 601 INDEX RANGE SCAN 245456 IDHRIS IDX_ADD_DATE INDEX
对比两个执行计划
select sq.SNAP_ID,sq.SQL_ID,sq.EXECUTIONS_DELTA,sq.PARSE_CALLS_DELTA,sq.PLAN_HASH_VALUE,sq.DISK_READS_DELTA,
sq.BUFFER_GETS_DELTA,sq.ROWS_PROCESSED_DELTA,sq.CPU_TIME_DELTA,sq.ELAPSED_TIME_DELTA,sq.IOWAIT_DELTA
from dba_hist_sqlstat sq,dba_hist_snapshot sn where sq.snap_id=sn.snap_id and sq.sql_id='b9vfj9nfx8h96' and sq.plan_hash_value in (3318088377,1009235934)
and sn.snap_id in (54635,54563)SNAP_ID SQL_ID EXECUTIONS_DELTA PARSE_CALLS_DELTA PLAN_HASH_VALUE DISK_READS_DELTA BUFFER_GETS_DELTA ROWS_PROCESSED_DELTA CPU_TIME_DELTA ELAPSED_TIME_DELTA IOWAIT_DELTA
---------- ------------- ---------------- ----------------- --------------- ---------------- ----------------- -------------------- -------------- ------------------ ------------54563 b9vfj9nfx8h96 6 6 1009235934 491 743341 20869 3643447 5020230 148105654635 b9vfj9nfx8h96 5 6 3318088377 581 1399105 11071 168190432 165837994 1311920
4.解决办法
在 Oracle 10g 上,可以使用不同的选项将执行计划绑定到sql, 如果不能对源代码使用hint,则可以使用outline或 SQL Profile功能.
SQL profile 比outline更可取,因为管理outline可能会变得很麻烦,并且有时outline可能无法按预期工作。
这里使用SQL Profile稳定执行计划有两种方式:
4.1 SQLTXPLAIN 也称为 SQLT
4.11 下载coe_xfr_sql_profile.sql
oracle Server Technologies Center of Expertise - ST CoE 提供的工具:
oracle官网下载
github下载
SQLT 提供了脚本 coe_xfr_sql_profile.sql,有助于轻松地针对语句创建 SQL profile,帮我们将目标SQL_ID与理想的执行计划绑定起来
下载 SQLT 后,将存档解压缩到选择的工作目录中。
要使用该脚本,需要知道语句的 SQL_ID 以及要绑定到该语句的计划的 PLAN_HASH_VALUE
4.12 使用方法
Usage:
sqlplus / as sysdba
SQL> START coe_xfr_sql_profile.sql [SQL_ID] [PLAN_HASH_VALUE];
4.13 执行coe_xfr_sql_profile.sql
因为上面已经获取SQL_ID及理想的plan_hash_value,所以这里选择直接执行:
SQL> @./coe_xfr_sql_profile.sql b9vfj9nfx8h96 1009235934
Parameter 1:
SQL_ID (required)PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------3028670118 .6621009235934 .6973233671506 1.4723318088377 221.581429843609Parameter 2:
PLAN_HASH_VALUE (required)Values passed:
~~~~~~~~~~~~~
SQL_ID : "b9vfj9nfx8h96"
PLAN_HASH_VALUE: "1009235934"Execute coe_xfr_sql_profile_b9vfj9nfx8h96_1009235934.sql
on TARGET system in order to create a custom SQL Profile
with plan 1009235934 linked to adjusted sql_text.COE_XFR_SQL_PROFILE completed.
这将在当前的工作目录中生成一个脚本和一个日志文件:
4.14 执行coe_xfr_sql_profile.sql产生的sql profile文件
SQL>host ls
coe_xfr_sql_profile_b9vfj9nfx8h96_1009235934.sql coe_xfr_sql_profile.log coe_xfr_sql_profile.sql
现在执行此脚本 (coe_xfr_sql_profile_b9vfj9nfx8h96_1009235934.sql ) 以生成 SQL profile文件,该文件将指示优化器使用指定的计划
SQL>@./coe_xfr_sql_profile_b9vfj9nfx8h96_1009235934.sql
4.15 验证
SQL>select sql_id, sql_profile from V$SQLAREA where sql_id='b9vfj9nfx8h96'
SQL_ID SQL_PROFILE
------------- ----------------------------
b9vfj9nfx8h96 coe_b9vfj9nfx8h96_1009235934
实际执行状况
select SAMPLE_ID,SAMPLE_TIME,SQL_ID,SQL_PLAN_HASH_VALUE
from v$active_session_history
where sql_id='b9vfj9nfx8h96' AND to_char(sample_time,'YYYY-MM-DD HH24:MI:SS') LIKE '2023-09-08%'
SAMPLE_ID SAMPLE_TIME SQL_ID SQL_PLAN_HASH_VALUE
---------- ---------------------------------------- ------------- -------------------194599239 08-SEP-23 10.50.10.108 AM b9vfj9nfx8h96 1009235934194598642 08-SEP-23 10.40.11.518 AM b9vfj9nfx8h96 1009235934194598641 08-SEP-23 10.40.10.518 AM b9vfj9nfx8h96 1009235934
4.2 SQL Tuning Advisor方式
透过bms_sqltune去创建tunning task,确认输出理想的执行计划后,将该sql profile与目表sql_id绑定
由于本文的重点只是想简单的替换较理想的执行计划,因此此种方式在这里仅作演示
4.21 第一次Tuning task
SQL>exec dbms_sqltune.drop_tuning_task('coe_b9vfj9nfx8h96_1009235934');
SQL> declare
t_task_name varchar2(255);
t_sql_id v$session.prev_sql_id%type;
begin
t_sql_id:='b9vfj9nfx8h96';
t_task_name:='sqlb9vfj9nfx8h96';
t_task_name:=dbms_sqltune.create_tuning_Task(sql_id=>t_sql_id,task_name=>t_task_name);
dbms_sqltune.execute_tuning_task(t_task_name);
end;
PL/SQL procedure successfully completed.
4.22 输出第一次报告
由于此次执行,有建议,这里仅贴出建议的部分
SQL>select dbms_sqltune.report_tuning_task('sqlb9vfj9nfx8h96') from dual
1- Index Finding (see explain plans section below)
--------------------------------------------------The execution plan of this statement can be improved by creating one or moreindices.Recommendation (estimated benefit: 98.62%)------------------------------------------- Consider running the Access Advisor to improve the physical schema designor creating the recommended index.create index IDHRIS.IDX$$_339980001 onIDHRIS.EM_CARD_RECORD("PNL_NO","CARD_TM");
4.23 执行报告建议部分
第一次运行,建议创建一个索引,照做
SQL>create index IDHRIS.pnlno_cardtm on IDHRIS.EM_CARD_RECORD("PNL_NO","CARD_TM")
Index IDHRIS.PNLNO_CARDTM 已建立.
4.24 第二次tunning task
不要忘记Drop第一次产生的tuning task
SQL>exec dbms_sqltune.drop_tuning_task( 'sqlb9vfj9nfx8h96');
已順利完成 PL/SQL 程序.
执行第二次tunning task
由于先前的sql_id:b9vfj9nfx8h96已经从share_pool age out,按第一次tuning task的方式执行会出错
故这里改为直接使用sql_text方式去执行tuning task
SQL>declare
t_task_name varchar2(255);
t_sql_text clob;
begin
t_sql_text:='INSERT INTO VIE_BU_IN_EM_CARD_RECORD (FACT_NO, PNL_NO, CARD_DATE,CARD_TM, SEQ_NO, MAR_NO, ADD_NAME, ADD_DATE, UPD_NAME, UPD_DATE, SOURCE_MK, FACT_NO1, PNL_NO1)
select FACT_NO, PNL_NO, CARD_DATE,CARD_TM, SEQ_NO, MAR_NO, ADD_NAME, TO_CHAR(SYSDATE, :"SYS_B_0") ADD_DATE, UPD_NAME, UPD_DATE, SOURCE_MK, FACT_NO1, PNL_NO1
FROM TMP_VIE_BU_IN_EM_CARD_RECORD a
where not exists(select :"SYS_B_1" from VIE_BU_IN_EM_CARD_RECORD b where a.fact_no1 = b.fact_no1 and a.pnl_no = b.pnl_no and a.card_date = b.card_date and a.card_tm = b.card_tm and b.card_date BETWEEN TO_CHAR(SYSDATE -:"SYS_B_2", :"SYS_B_3") AND TO_CHAR(SYSDATE, :"SYS_B_4"))';
t_task_name:='sqlb9vfj9nfx8h96';
t_task_name:=dbms_sqltune.create_tuning_Task(sql_text=>t_sql_text,user_name=>'CARD2HRIS', task_name=>t_task_name);
dbms_sqltune.execute_tuning_task(t_task_name);
end;
4.25 输出第二次报告
输出完整报告如下,
需要注意的是:
1.original的plan_hash_value是1009235934,这是按步骤4.1中的方式绑定的执行计划,这也从侧面佐证4.1的方式已经生效
2.从输出报告来看,创建建议的index后,产生了更优秀的执行计划plan_hash_value:563030811
SQL>select dbms_sqltune.report_tuning_task('sqlb9vfj9nfx8h96') from dual
"GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : sqlb9vfj9nfx8h96
Tuning Task Owner : SYSTEM
Scope : COMPREHENSIVE
Time Limit(seconds) : 1800
Completion Status : COMPLETED
Started at : 09/08/2023 15:22:25
Completed at : 09/08/2023 15:22:26
Number of SQL Profile Findings : 1-------------------------------------------------------------------------------
Schema Name: CARD2HRIS
SQL ID : a4q778rt9z6rw
SQL Text : INSERT INTO VIE_BU_IN_EM_CARD_RECORD (FACT_NO, PNL_NO,CARD_DATE,CARD_TM, SEQ_NO, MAR_NO, ADD_NAME, ADD_DATE, UPD_NAME,UPD_DATE, SOURCE_MK, FACT_NO1, PNL_NO1)select FACT_NO, PNL_NO, CARD_DATE,CARD_TM, SEQ_NO, MAR_NO,ADD_NAME, TO_CHAR(SYSDATE, :"SYS_B_0") ADD_DATE, UPD_NAME,UPD_DATE, SOURCE_MK, FACT_NO1, PNL_NO1FROM TMP_VIE_BU_IN_EM_CARD_RECORD awhere not exists(select :"SYS_B_1" from VIE_BU_IN_EM_CARD_RECORD b where a.fact_no1 = b.fact_no1 and a.pnl_no = b.pnl_no anda.card_date = b.card_date and a.card_tm = b.card_tm andb.card_date BETWEEN TO_CHAR(SYSDATE -:"SYS_B_2", :"SYS_B_3") ANDTO_CHAR(SYSDATE, :"SYS_B_4"))-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------1- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------A potentially better execution plan was found for this statement.Recommendation (estimated benefit: 99.65%)------------------------------------------- Consider accepting the recommended SQL profile.execute dbms_sqltune.accept_sql_profile(task_name => 'sqlb9vfj9nfx8h96',replace => TRUE);-------------------------------------------------------------------------------
ADDITIONAL INFORMATION SECTION
-------------------------------------------------------------------------------
- SQL Profile "coe_b9vfj9nfx8h96_1009235934" exists for this statement andwas ignored during the tuning process.-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------1- Original With Adjusted Cost
------------------------------
Plan hash value: 1009235934---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 394 | 1745 (1)| 00:00:21 |
|* 1 | HASH JOIN ANTI | | 1 | 394 | 1745 (1)| 00:00:21 |
| 2 | TABLE ACCESS FULL | TMP_VIE_BU_IN_EM_CARD_RECORD | 1 | 357 | 2 (0)| 00:00:01 |
| 3 | VIEW | VW_SQ_1 | 9153 | 330K| 1742 (1)| 00:00:21 |
| 4 | NESTED LOOPS | | 9153 | 455K| 1742 (1)| 00:00:21 |
| 5 | TABLE ACCESS BY INDEX ROWID| EM_CARD_RECORD | 30417 | 1009K| 1735 (1)| 00:00:21 |
|* 6 | INDEX RANGE SCAN | IDX_ADD_DATE | 54751 | | 169 (1)| 00:00:03 |
|* 7 | INDEX UNIQUE SCAN | PK_SYS_DATA_PERMISSION | 1 | 17 | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - access("A"."FACT_NO1"="ITEM_1" AND "A"."PNL_NO"="ITEM_2" AND "A"."CARD_DATE"="ITEM_3" AND "A"."CARD_TM"="ITEM_4")6 - access("CARD_DATE">=TO_CHAR(SYSDATE@!-TO_NUMBER(:SYS_B_2),:SYS_B_3) AND "CARD_DATE"<=TO_CHAR(SYSDATE@!,:SYS_B_4))7 - access("DATA_TYPE"='A' AND "LOGIN_USER"=SYS_CONTEXT('USERENV','CURRENT_USER') AND "FACT_NO1"="DATA_NO")2- Using SQL Profile
--------------------
Plan hash value: 563030811--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 357 | 6 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | TMP_VIE_BU_IN_EM_CARD_RECORD | 1 | 357 | 2 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 51 | 4 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_SYS_DATA_PERMISSION | 1 | 17 | 1 (0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID| EM_CARD_RECORD | 1 | 34 | 3 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | PNLNO_CARDTM | 1 | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter( NOT EXISTS (SELECT 0 FROM IDHRIS."EM_CARD_RECORD" "EM_CARD_RECORD",IDHRIS."SYS_DATA_PERMISSION" "SYS_DATA_PERMISSION" WHERE "DATA_NO"=:B1 AND "LOGIN_USER"=SYS_CONTEXT('USERENV','CURRENT_USER') AND "DATA_TYPE"='A' AND "CARD_TM"=:B2 AND "PNL_NO"=:B3 AND "FACT_NO1"=:B4 AND "CARD_DATE"=:B5 AND "CARD_DATE"<=TO_CHAR(SYSDATE@!,:SYS_B_4) AND "CARD_DATE">=TO_CHAR(SYSDATE@!-TO_NUMBER(:SYS_B_2),:SYS_B_3) AND "FACT_NO1"="DATA_NO"))4 - access("DATA_TYPE"='A' AND "LOGIN_USER"=SYS_CONTEXT('USERENV','CURRENT_USER') AND "DATA_NO"=:B1)5 - filter("FACT_NO1"=:B1 AND "CARD_DATE"=:B2 AND "CARD_DATE"<=TO_CHAR(SYSDATE@!,:SYS_B_4) AND "CARD_DATE">=TO_CHAR(SYSDATE@!-TO_NUMBER(:SYS_B_2),:SYS_B_3) AND "FACT_NO1"="DATA_NO")6 - access("PNL_NO"=:B1 AND "CARD_TM"=:B2)-------------------------------------------------------------------------------
"
4.26 绑定执行计划
接下来要做的是使用dbms_sqltune.accept_sql_profile去将目标sql与新的执行计划作绑定
execute dbms_sqltune.accept_sql_profile(task_name =>'sqlb9vfj9nfx8h96',replace => TRUE,force_match=>true);
PL/SQL procedure successfully completed.
参数force_match默认值是false,表示只有在SQL文本完全匹配的情况下才会应用SQL Profile,这种情况下只要目标SQL的SQL文本发生一点变动,原有的SQL profile就将失去作用
4.27 验证
SQL>select sql_id, sql_profile from V$SQLAREA where sql_id='b9vfj9nfx8h96'
SQL_ID SQL_PROFILE
------------- ----------------------------
b9vfj9nfx8h96 SYS_SQLPROF_01629d1759d48000
从最近的结果来看,已经选择走新的执行计划了
SQL>select SAMPLE_ID,SAMPLE_TIME,SQL_ID,SQL_PLAN_HASH_VALUE
from v$active_session_history
where sql_id='b9vfj9nfx8h96' AND to_char(sample_time,'YYYY-MM-DD HH24:MI:SS') LIKE '2023-09-08%';
SAMPLE_ID SAMPLE_TIME SQL_ID SQL_PLAN_HASH_VALUE
---------- ------------------------------ ------------- -------------------194617211 08-SEP-23 03.50.29.430 PM b9vfj9nfx8h96 563030811194617210 08-SEP-23 03.50.28.430 PM b9vfj9nfx8h96 563030811194617209 08-SEP-23 03.50.27.430 PM b9vfj9nfx8h96 563030811
相关文章:
使用sql profile 稳定执行计划的案例
文章目录 1.缘起2.变慢的sql3.检查瓶颈4.解决办法4.1 SQLTXPLAIN 也称为 SQLT4.11 下载coe_xfr_sql_profile.sql4.12 使用方法4.13 执行coe_xfr_sql_profile.sql4.14 执行coe_xfr_sql_profile.sql产生的sql profile文件4.15 验证 4.2 SQL Tuning Advisor方式4.21 第一次Tuning …...
海南大学金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书
海南大学金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书...
[N0wayback 2023春节红包题] happyGame python反编译
这个反编译的比较深 一,从附件的图标看是python打包的exe文件,先用pyinstxtractor.py 解包 生成的文件在main.exe_extracted目录下,在这里边找到main 二,把main改名为pyc然后加上头 这个头从包里找一个带头的pyc文件ÿ…...
Redis 初识与入门
1. 什么是Redis Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、…...
【STM32】片上ADC的初步使用
基于stm32f103系列 基于《零死角玩转 STM32F103—指南者》 ADC简介 stm32f103上的ADC 数量:3 精度:12bit(4096) 通道:ADC1,ADC2均有16个通道,ADC3有8个 功能: 转换结束、注入转换结束和发生模拟看门狗事件时产生中断。 …...
esxi下实现ikuai相同的两个网卡,单独路由配置
1.首先安装配置双网卡。 因为esxi主机只接入了一根外网的网线,那么我们这两个网卡都是一样的网卡,具体的到系统里面进行设置。 2.开机安装系统 进入配置界面,此处就不用多说了,可以看我之前的文档,或者网上其他人的安…...
Windows环境下Elasticsearch相关软件安装
Windows环境下Elasticsearch相关软件安装 本文将介绍在 windows 环境下安装 Elasticsearch 相关的软件。 1、安装Elasticsearch 1.1 安装jdk ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持,所以要先安装JAVA环境。 由于ElasticSear…...
配置Jedis连接池
一、概述 Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。 二、创建连接池 public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//配置连接池Jedi…...
Windows 12 开源网页版
前言 Windows 12 网页版是一个开源项目,使用标准网络技术,例如 Html、CSS 和 Javascript, 希望让用户在网络上预先体验 Windows 12 Windows 12 网页版download Windows 12 网页版 gitlab项目Windows 12 网页版 downloadWindows 12 demo参考downloaddemo test 开始菜单 …...
circleMidpoint(scrPt c, GLint r) 未定义的标识符,openGL第四章例子 ,画饼状图。
以下是完整的例子。在第四版 《计算机图形学 with openGL》第四章的例子中,竟然只调用了circleMidpoint(scrPt &c, GLint r) ,没有实现,我认为是系统方法,怎么找都找不到。openGL 官方文档也没找到,这不会是自定义…...
RKNN模型评估-性能评估和内存评估
基于Python的模型评估 perf_debug:进行性能评估时是否开启debug 模式。在 debug 模式下,可以获取到每一层的运行时间,否则只能获取模型运行的总时间。默认值为 False。 eval_mem: 是否进入内存评估模式。进入内存评估模式后,可以…...
window mysql-8.0.34 zip解压包安装
window系统上安装mysql8 解压版 下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.34-winx64.zip安装 用解压软件解压刚下载的mysql-8.0.34-winx64.zip 的文件至d:\devs路径下。 创建配置文件my.ini到路径d:\devs\mysql-8.0.34-winx64下 [mysqld] # 设置…...
Mysql判断某个数据库中是否包含某个表,与pymysql工具函数
查看某个数据库中的全部表: SELECT table_name FROM information_schema.tables WHERE table_schema 数据库名因此查看某个库中的某个表可以使用: SELECT table_name FROM information_schema.tables WHERE table_schema 数据库名 AND table_name 表…...
快速掌握正则表达式
文章目录 限定符 Qualifier第一个常用限定符 ?第二个常用限定符 *第三个常用限定符 或运算符字符类元字符 Meta-characters\d 数字字符\w 单词字符空白符 \s.任意字符^ $ 行首行尾 贪婪与懒惰匹配 Greedy vs Lazy Match实例 1 :RGB颜色匹配实例 2 &…...
git: ‘lfs‘ is not a git command unclear
首先可以尝试 git lfs install 是否可以,不可以后就看这个连接:https://stackoverflow.com/questions/48734119/git-lfs-is-not-a-git-command-unclear。 我的是ubuntu,所以: 保证这个前提: git-lfs requires git ve…...
代码随想录--哈希--两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 import java.util.ArrayList; import java.util.HashMap; import java.util.List;public class SSS {public …...
基于腾讯文档进行应届生个人求职记录
1. 新建一个腾讯文档 电脑登录QQ,点击“腾讯文档”功能键。 2. 可以选择下载客户端,也可以直接进入网页版。(本人使用网页版) 3. 点击新建,选择在线表格。 4. 编辑表名,表内容。 5. 设置文档权限…...
计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)
图像分类 教程博客_传送门链接:链接 在本教程中,您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型,耐心看完,相信会有很大收获。废话不…...
(18)线程的实例认识:线程的控制,暂停,继续,停止,线程相互控制,协作
话不多,但比较中肯,本文参照c# 线程暂停继续的实现方式_哔哩哔哩_bilibili 一、老方式 1、这是一个老的实现方式,基本不推荐,背后控制的原理需要了解。 界面:三个button一个textbox …...
c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入
c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入 功能介绍代码案例输出结果封装扩展方法控制台调用 其他方法地址 功能介绍 1. 输入的数字是整数,则直接返回整数部分的字符串表示。 2. 如果输入的数字是小数,则执行…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
