使用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. 如果输入的数字是小数,则执行…...
大数据精准营销大数据平台应用场景有哪些,平台优势有哪些?
精准营销大数据平台应用场景有很多种,比如在银行领域,我通过相应的客户数据,也可以给客户推广一些银行业务。还可以运用于证券行业,除此之外还可以运用于保险或者信托行业,借助精准营销大数据平台可以进行主动营销。那…...
Pyspark案例综合(数据计算)
数据计算 map方法 map算子 map算子(成员方法)接受一个处理函数,可用lambda快速编写,对RDD内的元素一一处理,返回RDD对象 链式调用 对于返回值是新的RDD的算子,可以通过链式调用的方式多次调用算子 &q…...
电路电子技术1--关联参考方向及功率的计算
1.判断 电流由元件的低点位端流向高电位端的参考方向称为关联参考方向。() 考点:电流、电压的参考方向 解释:在一些复杂的电路中,往往不能预先确定某段电路上的电流、电压的实际方向,所以引进了 “关联参考方向”。为了能够解决问…...
【C++】AVL树的插入操作实现以及验证是否正确(带平衡因子)
文章目录 前言一、AVL树结点的定义二、AVL树的插入(Insert)插入完整代码:1.左单旋(RotateL)2.右单旋(RotateR)3.先右单旋再左单旋(RotateRL)1.保存的bf为02.保存的bf为13…...
【Linux-Day10-信号量,共享内存,消息队列】
信号量 信号量描述 信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源 时,需要对信号量的值进行原子减一,该操作被称为 P 操作。 当信号量值为 0 时,代表没有资源可用,P 操作…...
使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决
记录:471 场景:使用IntelliJ IDEA本地启动调试Flink流计算时,报错一:加载DataStream报错java.lang.ClassNotFoundException。报错二:No ExecutorFactory found to execute the application。 版本:JDK 1.…...
对象及日期对象
对象 1.什么是对象 类是对象的抽象,对象是类的实例 程序算法数据结构 万物皆对象,对象是一个具体的事物,看到见摸得着,对象是一组无序相关属性和方法的集合(无序,所以对象没有length属性),所有事物都是对象,列如字符串,数值,数组,函数等. 属性:事物的特征,在对象中用属性表…...
鼠标滚轮编码器解析
文章目录 前言一、鼠标滚轮编码器逻辑?二、使用步骤 1.引入库2.读入数据总结 前言 鼠标滚轮编码器为三脚接入,一个COM脚C(一般是接地),两个脉冲波形输入脚A、B,转动滚轮编码器会在两个脉冲输入脚上产生脉冲…...
【PTA】攀拓(PAT)- 程序设计(甲级)2023年春季考试
个人学习记录,代码难免不尽人意。 今天又斥资买了今年春季的真题一试,呃,感觉尽力了,89分,在当年排名23,感觉还不错,没有出现读不懂的题目和没有思路的情况,扣的11分分别是第二题两个…...
Spring Cloud Gateway 实现原理
Spring Cloud Gateway是Spring Cloud生态系统中的一个组件,用于构建基于Spring Boot的微服务架构中的网关服务。它的主要目的是提供一种灵活的方式来路由、过滤和转换HTTP请求,从而允许您构建强大、高性能的微服务应用程序。 以下是Spring Cloud Gatewa…...
手机怎么制作网址链接/南宁seo结算
1.OutputFormat接口实现类OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了 OutputFormat接口。下面我们介绍几种常见的OutputFormat实现类。(1) 文本输出TextOutputFormat默认的输出格式是TextOutputFormat,它把每条记录写为文本行。它…...
dw个人网站制作/深圳网站开发制作
一:利用jquery方法获得 1:取值 $(window.parent.document).find("#second_navigator").html(); 2:改变父页面元素 $(window.parent.document).find("#second_navigator").html(“我是从iframe里传来的值”); 二&…...
个人网站效果/seo优化方案模板
JSON 语法是 JavaScript 语法的子集。 JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集。 数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组JSON 名称/值对 JSON 数据的书写格式是:名称/值对。 名称/值对包括字段名称(在双引…...
wordpress默认管理员密码/百度搜图入口
node版本升级nvmnvmw覆盖安装第一次安装node,可以直接到官网下载安装程序直接安装就可以,但是安装后如何进行node的版本管理 发现网上也提供了node的版本管理工具: nvm nvm是MAC & Linux版本管理工具不适用于window nvmw nvmw是windo…...
有什么网站交互做的很好 知乎/福州百度推广电话
转载自https://mp.weixin.qq.com/s/MD2-xMWWXx7rpfWzd5XDxA 非常不错的总结 根据这几年的积累,整理了一份国内外学术界和工业界的牛人和大牛团队,供大家申请硕士、博士、博士后和找工作参考。 学校(排名不分先后): 哈工…...
微网站 小程序 区别/上海seo招聘
1、五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆&a…...