[20210413]CBC latch再討論2.txt
[20210413]CBC latch再討論2.txt
--//這是與別人的再次討論,實際上驗證我以前判斷,一般在讀讀模式下,oracle從11.2.0.4開始全表掃描,唯一索引,rowid模式下,
--//快速全索引掃描基本不會出現cbc latch,如果出現也許不巧遇到讀取cbc latch鏈時其它sql語句修改或者某種操作讀取其連結串列上其
--//它資料塊.
--//僅僅全索引掃描以及非索引唯一掃描會出現cbc latch等待事件。
--//另外我順便測試_db_hot_block_tracking=true跟蹤
1.環境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SYS@book> @ hide _db_hot_block_tracking
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
---------------------- ------------------------------------------ ------------- ------------- ------------ ----- ---------
_db_hot_block_tracking track hot blocks for hash latch contention TRUE FALSE FALSE TRUE IMMEDIATE
SYS@book> alter system set "_db_hot_block_tracking"=true scope=memory;
System altered.
SYS@book> alter system set "_db_hot_block_tracking"=true scope=both;
System altered.
SYS@book> select * from x$kslhot;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 0 0
0000000086199AB0 1 1 0 0
0000000086199AC0 2 1 0 0
0000000086199AD0 3 1 0 0
0000000086199AE0 4 1 0 0
0000000086199AF0 5 1 0 0
0000000086199B00 6 1 0 0
0000000086199B10 7 1 0 0
0000000086199B20 8 1 0 0
0000000086199B30 9 1 0 0
10 rows selected.
--//視乎僅僅記錄10個塊地址。
2.建立測試環境:
SCOTT@book> create table job_times (sid number, time_ela number,method varchar2(20));
Table created.
SCOTT@book> create table t as select rownum id ,cast('test' as varchar2(10)) name from dual ;
Table created.
SCOTT@book> alter table t modify ( id not null );
Table altered.
--//分析表略。
SCOTT@book> select rowid from t;
ROWID
------------------
AAAWdqAAEAAAALbAAA
SCOTT@book> @ rowid AAAWdqAAEAAAALbAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
92010 4 731 0 0x10002DB 4,731 alter system dump datafile 4 block 731 ;
create index i_t_id on t(id);
--//create unique index i_t_id on t(id);
$ cat m10.txt
set verify off
host sleep $(echo &&3/50 | bc -l )
variable vmethod varchar2(20);
exec :vmethod := '&&2';
insert into job_times values ( sys_context ('userenv', 'sid') ,dbms_utility.get_time ,:vmethod) ;
commit ;
declare
v_id number;
v_d date;
begin
for i in 1 .. &&1 loop
select /*+ full(t) &&3 */ count (name) into v_id from t ;
--select /*+ index(t) &&3 */ count (name) into v_id from t ;
--select /*+ ROWID(t) &&3 */ count (name) into v_id from t where rowid='AAAWdqAAEAAAALbAAA';
--select /*+ index(t) &&3 */ count (name) into v_id from t where id=1;
--select /*+ index_ffs(t) &&3 */ count (*) into v_id from t ;
--select /*+ index_ffs(t) &&3 */ count (name) into v_id from t ;
--select /*+ ROWID(t) &&3 */ count (name) into v_id from t where rowid between 'AAAWdqAAEAAAALbAAA' and 'AAAWdqAAEAAAALbAAB';
end loop;
end ;
/
update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context ('userenv', 'sid') and method=:vmethod;
commit;
quit
--//注:唯一索引,與非唯一索引分開測試。在提示中加入 &&3,主要避免出現cursor: pin S等待事件。
--//測試時分別註解上面的部分。
--//另外index_ffs我使用的是select /*+ index_ffs(t) &&3 */ count (*) into v_id from t ;
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1full=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1index_fs=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1rowid=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1not_uniindex=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1uniindex=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1indexffs=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1indexffs_name=150 {} >/dev/null
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1rowidbetween=150 {} >/dev/null
--//注每次測試完成我都重啟資料庫。這樣檢視x$kslhot內容會清空。
3.測試方法在前面的測試已經說明,僅僅記錄測試結果:
--//每次測試前我都單獨執行要測試sql語句5次。
--//使用提示 /*+ full(t) &&3 */
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 16781635 2
0000000086199AB0 1 1 16781636 1
--//16781635 = set dba 4,4419 = alter system dump datafile 4 block 4419 = 0x1001143
--//16781636 = set dba 4,4420 = alter system dump datafile 4 block 4420 = 0x1001144
SYS@book> @ find_obj 4 4419
FILE_ID BLOCK_ID BLOCKS SEGMENT_TYPE OWNER SEGMENT_NAME PARTITION_NAME EXTENT_ID BYTES TABLESPACE_NAME RELATIVE_FNO SEGTSN SEGRFN SEGBID
---------- ---------- ---------- -------------------- ------ --------------- --------------- ---------- ---------- ------------------------------ ------------ ---------- ---------- ----------
4 4416 8 TABLE SCOTT JOB_TIMES 0 65536 USERS 4 4 4 4418
--//僅僅插入或者修改JOB_TIMES表是出現少量cbc latch。
--//使用提示 /*+ index(t) &&3 */,注執行計劃使用的是全索引掃描。
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 16781643 464011
--//16781643 = set dba 4,4427 = alter system dump datafile 4 block 4427 = 0x100114b
SYS@book> @ find_obj 4 4427
FILE_ID BLOCK_ID BLOCKS SEGMENT_TYPE OWNER SEGMENT_NAME PARTITION_NAME EXTENT_ID BYTES TABLESPACE_NAME RELATIVE_FNO SEGTSN SEGRFN SEGBID
---------- ---------- ---------- -------------------- ------ --------------- --------------- ---------- ---------- ------------------------------ ------------ ---------- ---------- ----------
4 4424 8 INDEX SCOTT I_T_ID 0 65536 USERS 4 4 4 4426
SYS@book> select HEADER_FILE,HEADER_BLOCK from dba_segments where owner='SCOTT' and segment_name='I_T_ID';
HEADER_FILE HEADER_BLOCK
----------- ------------
4 4426
--//可以發現cbc latch主要發生在索引段上,當前索引很少也就是root節點上。
--//使用提示 /*+ ROWID &&3 */
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 16781639 3
0000000086199AB0 1 1 16781637 9
0000000086199AC0 2 1 16781635 14
0000000086199AD0 3 1 16781636 14
0000000086199AE0 4 1 16781638 2
--//僅僅插入或者修改JOB_TIMES表是出現少量cbc latch。
--//使用提示 /*+ index(t) &&3 */
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 4195268 3
0000000086199AB0 1 1 16781643 386673
--//16781643 = set dba 4,4427 = alter system dump datafile 4 block 4427 = 0x100114b
SYS@book> @ find_obj 4 4427
FILE_ID BLOCK_ID BLOCKS SEGMENT_TYPE OWNER SEGMENT_NAME PARTITION_NAME EXTENT_ID BYTES TABLESPACE_NAME RELATIVE_FNO SEGTSN SEGRFN SEGBID
---------- ---------- ---------- -------------------- ------ --------------- --------------- ---------- ---------- ------------------------------ ------------ ---------- ---------- ----------
4 4424 8 INDEX SCOTT I_T_ID 0 65536 USERS 4 4 4 4426
--//可以發現cbc latch主要發生在索引段上,當前索引很少也就是root節點上。
--//使用提示 /*+ index(t) &&3 */,但是索引建立為唯一索引看看。
SCOTT@book> create unique index i_t_id on t(id);
Index created.
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 16781635 5
0000000086199AB0 1 1 16781636 4
0000000086199AC0 2 1 16781637 3
0000000086199AD0 3 1 16781638 1
--//僅僅插入或者修改JOB_TIMES表是出現少量cbc latch。
--//使用提示 /*+ index_ffs(t) &&3 */.
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 16781636 2
0000000086199AB0 1 1 16781635 1
0000000086199AC0 2 1 16781637 1
0000000086199AD0 3 1 16781638 2
--//僅僅插入或者修改JOB_TIMES表是出現少量cbc latch。
--//使用提示 /*+ index_ffs(t) &&3 */,建立新索引。查詢變為select /*+ index_ffs(t) &&3 */ count (name) into v_id from t ;
SCOTT@book> create index i_t_id_name on t(id,name);
Index created.
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 16781635 3
0000000086199AB0 1 1 16781636 2
--//僅僅插入或者修改JOB_TIMES表是出現少量cbc latch。
SCOTT@book> Select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from scott.job_times group by method order by 3 ;
METHOD COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
p1rowid=150 150 2280 341990
p1uniindex=150 150 2382 357225
p1indexffs_name=150 150 2669 400324
p1indexffs=150 150 2698 404737
p1full=150 150 2769 415285
p1index_fs=150 150 6748 1012159
p1not_uniindex=150 150 7046 1056924
7 rows selected.
4.總結:
--//從執行時間上可以看出在讀讀模式下,只有全索引掃描以及非索引唯一掃描會出現cbc latch等待事件。而且出現的位置主要在
--//索引段上,而對應的資料塊段沒有。
--//可以看出11.2.0.4以後讀讀模式,看到cbc latch更多的應該是索引段,而且執行計劃可能是索引範圍掃描,非唯一索引,全掃描掃
--//描.
--//另外快速全索引掃描相當於把索引當作表,也沒有出現出現cbc latch。
--//查詢x$kslhot看到涉及JOB_TIMES表應該不算。
--//補充測試rowid between的情況,注意該資料塊一定要先快取,不然可能走直接路徑讀。
$ seq 150 | xargs -I{} -P 150 sqlplus -s -l scott/book @m10.txt 1e5 p1rowidbetween=150 {} >/dev/null
SYS@book> select * from x$kslhot where KSLHOT_REF>0;
ADDR INDX INST_ID KSLHOT_ID KSLHOT_REF
---------------- ---------- ---------- ---------- ----------
0000000086199AA0 0 1 4195268 1
0000000086199AB0 1 1 16781637 2
SCOTT@book> Select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from scott.job_times group by method order by 3 ;
METHOD COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
p1rowid=150 150 2280 341990
p1uniindex=150 150 2382 357225
p1indexffs_name=150 150 2669 400324
p1indexffs=150 150 2698 404737
p1full=150 150 2769 415285
p1rowidbetween=150 150 4357 653557
p1index_fs=150 150 6748 1012159
p1not_uniindex=150 150 7046 1056924
8 rows selected.
--//rowid between 訪問2次資料塊,這樣對比前面的rowid時間多了差不多1倍。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2768582/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20210418]CBC latch再討論3.txt
- [20210419]CBC latch再討論4.txt
- [20190419]shared latch spin count 2.txt
- [20211229]再論19c latch free等待事件分析.txt事件
- [20190416]完善shared latch測試指令碼2.txt指令碼
- [20220412]shared pool latch與使用sga heap的疑問2.txt
- 討論
- [iOS Monkey 討論帖] 整套新的 fastmonkey 討論iOSAST
- [Note] git清空.git目錄後,重新再git init & git remote的討論GitREM
- httprunner 大佬討論群HTTP
- [譯] 討論 JS ⚡:文件JS
- 當我們在討論CQRS時,我們在討論些神馬?
- 小組討論結果
- js中分號的討論JS
- 當我們在討論遊戲社群時,我們在討論什麼?遊戲
- 【討論】論 cursor 在測試中的使用
- 主題討論,第六組
- 討論專案合理分層
- 資料分析主題討論
- 外掛需求討論群 241266707
- 原始碼防洩密討論原始碼
- 有沒有一些大廠的高階架構技術討論討論架構
- 求一.NET算術演算法.歡迎朋友們都進來討論討論.演算法
- AES CBC 加密解密加密解密
- laravel 事件系統 問題討論Laravel事件
- Flutter 仿QQ討論組頭像Flutter
- PHP vs Node.js 深入討論PHPNode.js
- 對容器映象的思考和討論
- 全域性角度出發討論敏捷敏捷
- Go知識圖譜討論帖Go
- Twitter:2019年Twitter遊戲討論度排行 日本為最熱衷討論遊戲國家遊戲
- mutex,latch,lock,enqueue hash chains latch基礎概念MutexENQAI
- 2149.令人討厭的手機號(再續)
- AES-CBC 模式加密模式加密
- 資料庫系統架構討論資料庫架構
- 為什麼需要討論“當代性”?
- 關於神經網路的討論神經網路
- Hibernate 一個更新問題的 討論