在实践中ORACLE数据库大型索引会引发性能问题。
大型索引必须被分区,避免索引分裂影响交易,降低索引层级,提升性能,提高索引可维护性。
索引也可以进行分区。可以选择按照表分区的方式进行分区(local索引),也可以针对global索引进行范围和hash分区。需注意global分区索引必须是前缀索引。
大索引阈值:单个索引或单个索引分区的大小大于10GB。
分析索引大小。针对大索引进行分析,针对大型的global类型的索引删除后进行重建。包含分区字段的查询,可建立local索引进行相应优化。不包含分区字段的查询,使用global索引,global索引优先将选择性高的字段放在前缀,同时使用索引前缀字段进行分区,如查询包含范围查询情况,建议使用区间分区,单点查询情况,使用hash分区。分区索引建立示例:
local分区:
CREATE INDEX idx_local ON table_A(col_A,col_B) local;
global_range分区:
CREATE INDEX idx_glob_range ON table_A (col_A,col_B) GLOBAL PARTITION BY range (col_A)
(PARTITION p1 VALUES LESS THAN (10) TABLESPACE users,PARTITION p2 VALUES LESS THAN (20) TABLESPACE users,PARTITION p_max VALUES LESS THAN (MAXVALUE) TABLESPACE users);
global_hash分区:
CREATE INDEX idx_glob_hash ON table_A (col_A,col_B) GLOBAL PARTITION BY HASH(col_A) partitions 16;
注意:使用分区索引,在进行分区操作(drop、merge等)需update indexes。
更多内容请关注公众号“测试小号等闲之辈”~