發(fā)布于:2021-02-20 00:00:22
0
143
0
索引塊爭(zhēng)用是具有高插入活動(dòng)性的非常常見的數(shù)據(jù)庫,在具有通常通過序列生成的單調(diào)遞增鍵值的表上尤其常見。
Oracle B樹索引是“右手的”索引,B樹的右葉節(jié)點(diǎn)包含最高的鍵,該鍵位于最低的樹級(jí)別。
當(dāng)基于用戶生成的鍵(例如通過序列)插入行時(shí),以及在列由基于序列的鍵值填充的列的情況下,索引葉節(jié)點(diǎn)爭(zhēng)用發(fā)生,最近的條目將位于B樹的最右葉塊中。
這意味著所有新行將存儲(chǔ)在索引的最右邊的葉塊中。隨著越來越多的會(huì)話向表中插入行,最右邊的葉子塊將滿。
Oracle將最右邊的葉子塊分為兩個(gè)葉子塊,其中一個(gè)塊包含除一行以外的所有行,而一個(gè)新塊僅包含一行。
這種類型的指數(shù)增長稱為“右手增長”指數(shù)。隨著越來越多的并發(fā)會(huì)話插入到索引的最右邊的葉塊中,該索引塊成為熱塊,并且該葉塊上的并發(fā)導(dǎo)致性能問題。
在Oracle RAC數(shù)據(jù)庫中,此問題被放大并成為更大的瓶頸。如果序列緩存(特定于實(shí)例)很小(默認(rèn)為20),則最右邊的葉子塊不僅在一個(gè)實(shí)例中而且在所有實(shí)例中都成為群集的一部分,并且該熱點(diǎn)塊必須是通過互連來回傳輸。
Oracle Database 18c引入了一種稱為可伸縮序列的新型序列。
現(xiàn)在在Oracle 18c中,在那些具有高并發(fā)性的數(shù)據(jù)攝取工作負(fù)載的情況下,通過生成無序的主鍵或唯一鍵值的新可伸縮序列有助于顯著減少由右手索引引起的序列和索引塊爭(zhēng)用,從而提供了與必須使用CREATE SEQUENCE或ALTER SEQUENCE語句的CACHE子句配置非常大的序列緩存的Oracle 19c之前的解決方案相比,吞吐量,數(shù)據(jù)負(fù)載可伸縮性和性能更高。
可伸縮序列由序列偏移號(hào)組成,默認(rèn)情況下包含6位數(shù)字
的前3位數(shù)字,從實(shí)例編號(hào)衍生100并將下一個(gè)3個(gè)位數(shù)從SID衍生該會(huì)話。
因此,假設(shè)具有SID 555且實(shí)例號(hào)為1的用戶–則偏移號(hào)為101555,對(duì)于實(shí)例2中具有SID 666的另一個(gè)會(huì)話,偏移號(hào)為102666。
我們可以使用EXTEND of NOEXTEND選項(xiàng)創(chuàng)建可伸縮序列。
為SCALE子句指定EXTEND選項(xiàng)時(shí),可伸縮序列值的長度為[X位數(shù)+ Y位數(shù)],其中X是序列偏移號(hào),Y是MAXVALUE子句中指定的位數(shù)。
讓我們看看使用EXTEND選項(xiàng)創(chuàng)建可伸縮序列時(shí)的工作方式。
請(qǐng)注意,每個(gè)實(shí)例中的序列生成的不同(無關(guān)和無序)值。
Instance 1
SQL> create sequence system.scale_ext_seq
2 start with 1 increment by 1
3 maxvalue 100
4 scale extend;
Sequence created.
SQL> select system.scale_ext_seq.nextval from dual;
NEXTVAL
----------
101007001
SQL> select sid from v$mystat where rownum = 1;
SID
----------
7
Instance 2
SQL> select system.scale_ext_seq.nextval from dual;
NEXTVAL
----------
102036021
SQL> select sid from v$mystat where rownum = 1;
SID
----------
36
當(dāng)為SCALE子句指定NOEXTEND選項(xiàng)時(shí),可伸縮序列中的位數(shù)不能超過MAXVALUE子句中指定的位數(shù)。
請(qǐng)注意,當(dāng)序列中的位數(shù)超過7(MAXVALUE子句1000000中的位數(shù))時(shí)會(huì)發(fā)生什么。
SQL>create sequence system.scale_noext_seq
start with 1 increment by 1
maxvalue 1000000
scale noextend;
Sequence created.
INSTANCE 1
SQL> select system.scale_noext_seq.nextval from dual;
NEXTVAL
----------
1010071
SQL> /
NEXTVAL
----------
1010072
SQL> /
NEXTVAL
----------
1010073
...
...
NEXTVAL
----------
1010078
SQL> /
NEXTVAL
----------
1010079
SQL> /
select system.scale_noext_seq.nextval from dual
*
ERROR at line 1:
ORA-64603: NEXTVAL cannot be instantiated for SCALE_NOEXT_SEQ. Widen the
sequence by 1 digits or alter sequence with SCALE EXTEND.
SQL> alter sequence system.scale_noext_seq maxvalue 10000000;
Sequence altered.
SQL> select system.scale_noext_seq.nextval from dual;
NEXTVAL
----------
10100741
INSTANCE 2
SQL> select system.scale_noext_seq.nextval from dual;
NEXTVAL
----------
10203661
作者介紹
熱門博客推薦