enq:TX-index contention等待事件
此等待事件發生的版本從10.2到11.2,在任何平臺都會出現
產生的原因:在OLTP RAC系統上,高併發應用下,與表相關的索引會發生很高的TX隊列的爭用。這通常在所有實例併發應用大量的INNSERT或DELETE操作。因爲當插入新行到index塊裏索引塊可能需要做splits動作。
事物將會有mode 4的TX lock,直到之前的session做完index block splits爲止。
index block &&split的概念:
索引的數據塊分爲root block、branch block、leaf block
root block:是一個索引的入口
branch block:<spearator key,leaf dba>,通過此鍵值來查找B-TREE的 leaf block
leaf block:存放數據的索引塊,實際數據存放在leaf block中,leaf blocks hold<index key,rowid>
index block split發生在一個新的記錄需要插入到索引塊中不能找到free space,那麼會話將開始index block split。在開始split時,這個session將會嘗試清空此block的keys來檢查是否有足夠的空間。
splieter會有如下大概操作:
分配新塊
複製一定百分比的rows到新的buffer裏。
添加新的buffer到索引結構並且提交操作。
索引分裂可能原因:
a、索引所在表的應用所給的壓力較大
b、表所對應的索引不正常的正常,即在B-TREE的一邊增長造成不平衡。
索引分裂類型:
leaf block split 細化爲 leaf node 90-10splits和leaf node 50-50 splits
Branch Block 50-50Split
Root Block 50-50Split
--可通過此語句來查詢其情況
SELECT Names.Name, Stats.Value, Stats.Statistic#
FROM V$sesstat Stats, V$statname Names
WHERE --stats.sid = (SELECT sid FROM v$mystat WHERE rownum = 1) AND
Names.Statistic# = Stats.Statistic#
AND Names.Name LIKE '%split%'
ORDER BY Stats.Statistic#;
leaf node 90-10splits:插入到索引leaf block葉子塊中的索引鍵是該塊中最大的鍵值(包括塊中已刪除的索引鍵值)。在此種情況下實施90-10split,原葉子塊仍保持99%的full,
而到另一個空的葉子塊中插入該條新的最大鍵值記錄。
leaf node 50-50splits:當插入到索引葉子塊中的索引鍵值不是該塊中的最大值時(包括塊中已刪除的索引鍵值),將發生 50/50split分裂,這意味着有一半索引記錄仍存在當前塊,
而另一半數據移動到新的葉子塊中。
Branch Block 50-50 Split 由於不斷的索引葉塊分裂需要將新的leaf block的信息加入到branch block中,當branch block沒有足夠空間容納新的記錄時,又會引發branch block的 Split。
branch block的split50-50的,即將一半記錄移動到新的branch block中。
Root Block 50-50 Split root block 根塊實際是一種特殊的branch block, 當root block 50-50split分裂發生時將分配2個新的數據塊, 分裂將一半的數據移動到一個新塊中,另一半數據移動到另一個新塊中。
並更新原來的root block,使之指向那2個新的數據塊,實際上是2個branch block了
enq:TX-index contention等待事件案例如下
Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
enq: TX - index contention 1,263,737 179,494 142 29.9 Concurrenc===>在top1上
db file sequential read 29,316,282 132,125 5 22.0 User I/O
buffer busy waits 2,255,337 87,767 39 14.6 Concurrenc
DB CPU 51,053 8.5
log file sync 4,144,556 26,134 6 4.4 Commit
根、枝、葉的分裂情況較爲嚴重
nstance Activity Stats DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> Ordered by statistic name
Statistic Total per Second per Trans
-------------------------------- ------------------ -------------- -------------
leaf node 90-10 splits 9,182 5.1 0.0
leaf node splits 332,103 183.2 0.1
branch node splits 1,632 0.9 0.0
root node splits 3 0.0 0.0
相關segment的等待情況
Segments by Row Lock Waits DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> % of Capture shows % of row lock waits for each top segment compared
-> with total row lock waits for all segments captured by the Snapshot
Row
Tablespace Subobject Obj. Lock % of
Owner Name Object Name Name Type Waits Capture
---------- ---------- -------------------- ---------- ----- ------------ -------
TRSEN TS_IDX_YTE IDX4_E_TRSEN_DIG _2014_11_2 INDEX 1,115,929 75.76==>發生爭用的索引
TRSEN E_HIS_11 T_E_OP_RECORD_HAND 2014_11_17 TABLE 42,574 2.89
TRSEN TS_IDX_YTE IDX04_T_E_EXT_IS INDEX 27,442 1.86
TRSEN TS_IDX_YTE IDX03_T_E_EXT_IS INDEX 26,256 1.78
TRSEN TS_TRSEN T_SMS_SS_1_LOCKS TABLE 24,796 1.68
-------------------------------------------------------------
Segments by ITL Waits DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> % of Capture shows % of ITL waits for each top segment compared
-> with total ITL waits for all segments captured by the Snapshot
Tablespace Subobject Obj. ITL % of
Owner Name Object Name Name Type Waits Capture
---------- ---------- -------------------- ---------- ----- ------------ -------
TRSEN TS_IDX_YTE IDX4_E_TRSEN_DIG _2014_11_2 INDEX 7,219 81.36==>伴隨的ITLwaits信息
TRSEN E_HIS_11 T_E_EXTREME_ISSUE_ 2014_11_14 TABLE 1,161 13.08
TRSEN TS_IDX_YTE IDX_WK_BIZ_CONTAINER 2014_11_17 INDEX 147 1.66
TRSEN TS_IDX_YTE IDX_T_E_WK_BIZ_SIG 2014_11_17 INDEX 81 .91
TRSEN TS_IDX_YTE IDX_WK_BIZ_HANDON 2014_11_17 INDEX 49 .55
-------------------------------------------------------------
Segments by Buffer Busy Waits DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> % of Capture shows % of Buffer Busy Waits for each top segment compared
-> with total Buffer Busy Waits for all segments captured by the Snapshot
Buffer
Tablespace Subobject Obj. Busy % of
Owner Name Object Name Name Type Waits Capture
---------- ---------- -------------------- ---------- ----- ------------ -------
TRSEN TS_IDX_YTE IDX4_E_TRSEN_DIG _2014_11_2 INDEX 1,986,465 83.67===>伴隨的buffer busy waits信息
TRSEN TS_IDX_YTE IDX04_T_E_EXT_IS INDEX 45,572 1.92
TRSEN STL_HIS_11 IDX1_STL_E_OPS_A 2014_11_17 INDEX 43,749 1.84
TRSEN TS_IDX_YTE IDX03_T_E_EXT_IS INDEX 42,478 1.79
TRSEN TS_IDX_YTS IDX2_STL_E_OPS_A 2014_11_17 INDEX 40,138 1.69
-------------------------------------------------------------
從上面的併發信息來看,由於應用壓力很大加上索引非平衡split導致了enq:TX-index contention事件。雖然有enq: TX - allocate ITL等待,但是可通過buffer busy waits可確定是做split導致,因爲在
做index split時,會寫index數據到new buffer裏,故有此等待的出現來佐證確實是索引分裂導致
解決方案:
1.將索引重新創建爲反向索引,反向索引可能會導致不必要的問題,不建議使用
2.Hash(散列)分區索引
3.如果索引關鍵字是從序列(sequence)生成的,則增加序列的高速緩存大小,在應用程序支持時,使用“無序”序列
4.定期rebuild索引來減輕這樣現象
產生的原因:在OLTP RAC系統上,高併發應用下,與表相關的索引會發生很高的TX隊列的爭用。這通常在所有實例併發應用大量的INNSERT或DELETE操作。因爲當插入新行到index塊裏索引塊可能需要做splits動作。
事物將會有mode 4的TX lock,直到之前的session做完index block splits爲止。
index block &&split的概念:
索引的數據塊分爲root block、branch block、leaf block
root block:是一個索引的入口
branch block:<spearator key,leaf dba>,通過此鍵值來查找B-TREE的 leaf block
leaf block:存放數據的索引塊,實際數據存放在leaf block中,leaf blocks hold<index key,rowid>
index block split發生在一個新的記錄需要插入到索引塊中不能找到free space,那麼會話將開始index block split。在開始split時,這個session將會嘗試清空此block的keys來檢查是否有足夠的空間。
splieter會有如下大概操作:
分配新塊
複製一定百分比的rows到新的buffer裏。
添加新的buffer到索引結構並且提交操作。
索引分裂可能原因:
a、索引所在表的應用所給的壓力較大
b、表所對應的索引不正常的正常,即在B-TREE的一邊增長造成不平衡。
索引分裂類型:
leaf block split 細化爲 leaf node 90-10splits和leaf node 50-50 splits
Branch Block 50-50Split
Root Block 50-50Split
--可通過此語句來查詢其情況
SELECT Names.Name, Stats.Value, Stats.Statistic#
FROM V$sesstat Stats, V$statname Names
WHERE --stats.sid = (SELECT sid FROM v$mystat WHERE rownum = 1) AND
Names.Statistic# = Stats.Statistic#
AND Names.Name LIKE '%split%'
ORDER BY Stats.Statistic#;
leaf node 90-10splits:插入到索引leaf block葉子塊中的索引鍵是該塊中最大的鍵值(包括塊中已刪除的索引鍵值)。在此種情況下實施90-10split,原葉子塊仍保持99%的full,
而到另一個空的葉子塊中插入該條新的最大鍵值記錄。
leaf node 50-50splits:當插入到索引葉子塊中的索引鍵值不是該塊中的最大值時(包括塊中已刪除的索引鍵值),將發生 50/50split分裂,這意味着有一半索引記錄仍存在當前塊,
而另一半數據移動到新的葉子塊中。
Branch Block 50-50 Split 由於不斷的索引葉塊分裂需要將新的leaf block的信息加入到branch block中,當branch block沒有足夠空間容納新的記錄時,又會引發branch block的 Split。
branch block的split50-50的,即將一半記錄移動到新的branch block中。
Root Block 50-50 Split root block 根塊實際是一種特殊的branch block, 當root block 50-50split分裂發生時將分配2個新的數據塊, 分裂將一半的數據移動到一個新塊中,另一半數據移動到另一個新塊中。
並更新原來的root block,使之指向那2個新的數據塊,實際上是2個branch block了
enq:TX-index contention等待事件案例如下
Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
enq: TX - index contention 1,263,737 179,494 142 29.9 Concurrenc===>在top1上
db file sequential read 29,316,282 132,125 5 22.0 User I/O
buffer busy waits 2,255,337 87,767 39 14.6 Concurrenc
DB CPU 51,053 8.5
log file sync 4,144,556 26,134 6 4.4 Commit
根、枝、葉的分裂情況較爲嚴重
nstance Activity Stats DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> Ordered by statistic name
Statistic Total per Second per Trans
-------------------------------- ------------------ -------------- -------------
leaf node 90-10 splits 9,182 5.1 0.0
leaf node splits 332,103 183.2 0.1
branch node splits 1,632 0.9 0.0
root node splits 3 0.0 0.0
相關segment的等待情況
Segments by Row Lock Waits DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> % of Capture shows % of row lock waits for each top segment compared
-> with total row lock waits for all segments captured by the Snapshot
Row
Tablespace Subobject Obj. Lock % of
Owner Name Object Name Name Type Waits Capture
---------- ---------- -------------------- ---------- ----- ------------ -------
TRSEN TS_IDX_YTE IDX4_E_TRSEN_DIG _2014_11_2 INDEX 1,115,929 75.76==>發生爭用的索引
TRSEN E_HIS_11 T_E_OP_RECORD_HAND 2014_11_17 TABLE 42,574 2.89
TRSEN TS_IDX_YTE IDX04_T_E_EXT_IS INDEX 27,442 1.86
TRSEN TS_IDX_YTE IDX03_T_E_EXT_IS INDEX 26,256 1.78
TRSEN TS_TRSEN T_SMS_SS_1_LOCKS TABLE 24,796 1.68
-------------------------------------------------------------
Segments by ITL Waits DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> % of Capture shows % of ITL waits for each top segment compared
-> with total ITL waits for all segments captured by the Snapshot
Tablespace Subobject Obj. ITL % of
Owner Name Object Name Name Type Waits Capture
---------- ---------- -------------------- ---------- ----- ------------ -------
TRSEN TS_IDX_YTE IDX4_E_TRSEN_DIG _2014_11_2 INDEX 7,219 81.36==>伴隨的ITLwaits信息
TRSEN E_HIS_11 T_E_EXTREME_ISSUE_ 2014_11_14 TABLE 1,161 13.08
TRSEN TS_IDX_YTE IDX_WK_BIZ_CONTAINER 2014_11_17 INDEX 147 1.66
TRSEN TS_IDX_YTE IDX_T_E_WK_BIZ_SIG 2014_11_17 INDEX 81 .91
TRSEN TS_IDX_YTE IDX_WK_BIZ_HANDON 2014_11_17 INDEX 49 .55
-------------------------------------------------------------
Segments by Buffer Busy Waits DB/Inst: STDDB/stddb1 Snaps: 51155-51156
-> % of Capture shows % of Buffer Busy Waits for each top segment compared
-> with total Buffer Busy Waits for all segments captured by the Snapshot
Buffer
Tablespace Subobject Obj. Busy % of
Owner Name Object Name Name Type Waits Capture
---------- ---------- -------------------- ---------- ----- ------------ -------
TRSEN TS_IDX_YTE IDX4_E_TRSEN_DIG _2014_11_2 INDEX 1,986,465 83.67===>伴隨的buffer busy waits信息
TRSEN TS_IDX_YTE IDX04_T_E_EXT_IS INDEX 45,572 1.92
TRSEN STL_HIS_11 IDX1_STL_E_OPS_A 2014_11_17 INDEX 43,749 1.84
TRSEN TS_IDX_YTE IDX03_T_E_EXT_IS INDEX 42,478 1.79
TRSEN TS_IDX_YTS IDX2_STL_E_OPS_A 2014_11_17 INDEX 40,138 1.69
-------------------------------------------------------------
從上面的併發信息來看,由於應用壓力很大加上索引非平衡split導致了enq:TX-index contention事件。雖然有enq: TX - allocate ITL等待,但是可通過buffer busy waits可確定是做split導致,因爲在
做index split時,會寫index數據到new buffer裏,故有此等待的出現來佐證確實是索引分裂導致
解決方案:
1.將索引重新創建爲反向索引,反向索引可能會導致不必要的問題,不建議使用
2.Hash(散列)分區索引
3.如果索引關鍵字是從序列(sequence)生成的,則增加序列的高速緩存大小,在應用程序支持時,使用“無序”序列
4.定期rebuild索引來減輕這樣現象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.