索引的高度 height 视乎 索引中记录的多少 、Leaf Block 的数量而定,一般 Height 为 3~4; 举例来
说当一个索引的高度为 4,但是其中包含大量删除的记录,那么通过索引 rebuild 往往可以降低其高度,例
如从 4 降低到 3。 假设该索引再次插入了大量的数据,造成 leaf block 不断分裂,最终导致 root block
再次分裂, 索引高度从 3 再次上升到 4,在这个 root block split 的过程中可能短期内阻塞索引的 DML
维护,导致进程等待” enqueue TX: index contention” , 这在 OLTP 环境中是很常见的问题, 所以一
般不推荐在 OLTP 环境中 rebuild index,虽然 rebuild index 能够减少索引碎片回收空间 ,但由于
rebuild index 可能导致索引高度降级,所以对于 OLTP 环境的索引 rebuild 需要慎重
--
在 split 过程中 寻找可复用的 free block 的过程称之为 failed probes on index block
reclamation,在正常的情况下这种找寻可复用块的过程是很快的 ,但是如果 恰好遇到 物理读缓慢或者 全
局的数据块争用时,该过程可能变得很慢,这将直接导致 split 变慢, 进而导致大量 INSERT 进程长时间等
待 enq: TX – index contention
--测试
--创建测试表
CREATE TABLE TEST(ID INT,NAME VARCHAR2(50),CREATED DATE);
--创建存储过程
BEGIN
FOR I IN 10000..20000 LOOP
INSERT INTO TEST
VALUES(I,RPAD(I,50,'X'),SYSDATE);
END LOOP;
commit;
END;
/
--查询数据行数量
SQL> select count(*) from test;
COUNT(*)
----------
10001
--创建测试索引,预留空间 0%
CREATE INDEX IDX_TEST_01 ON TEST(ID,NAME) PCTFREE 0;
--
ANALYZE INDEX IDX_TEST_01 VALIDATE STRUCTURE;
--查询索引信息:索引非分区索引,高度 3 层,索引总块数量 88,叶块数量 85,一个 root 块,两个
branch 块数量,使用率 98%
SELECT
name,PARTITION_NAME,HEIGHT,BLOCKS,LF_ROWS,LF_BLKS,PCT_USED,DEL_LF_ROWS,DEL_LF_RO
WS_LEN FROM INDEX_STATS;
NAME PARTI HEIGHT BLOCKS LF_ROWS LF_BLKS
PCT_USED DEL_LF_ROWS DEL_LF_ROWS_LEN
-------------------- ----- ---------- ---------- ---------- ----------
---------- ----------- ---------------
IDX_TEST_01 2 88 10001 85
98 0 0
--插入新的数据
INSERT INTO TEST VALUES(20001,RPAD(20001,50,'X'),SYSDATE);
SQL> commit;
--分析再次查询
ANALYZE INDEX IDX_TEST_01 VALIDATE STRUCTURE;
SELECT
评论