对于一个大的索引,在创建或重建时,速度问题无疑是一个必须考虑;
可以使用的选项有:Parallel, Nologging, Compress;
Nologging: 减少Redo的产生量
Parallel:并发,一般建议为物理CPU的个数,注意观察IO,CPU的情况
对于小表的情况下,使用并行带来的开销可能超过使用串行.
Compress: 空间压缩
########################################
完整的示例过程如下:
########################################
1 Alter session enable parallel DDL;
2 Create index pk_ind on OCS_WORKORDERTODO(col1,col2,...) nologging parallel tablespace ts_xxx;
3 Alter index pk_ind rebuild online nologging parallel;
4 在完成重建后,需要将索引标记改回去;
Alter index pk_ind logging noparallel;
5 完成后,建议再做一次完整的表分析:
Execute DBMS_STATS.GATHER_TABLE_STATS(owner=>'USERDB',tabname=>'OCS_WORKORDERTODO',estimate_percent=>'DBMS_STATS.AUTO_SIZE',cascade=>TRUE);
########################################
从Session级别可以考虑的其它参数:
########################################
1 加大排序区的大小:sort_area_size
Alter session set workarea_size_policy=manual;
alter session set sort_area_size=xxx;
这个Size一般可以为多大呢?1.5 * table_size;
建立或重建索引是排序是必须的?是的
Size过大,或带来什么问题,sort_area_size来自于PGA的SQL_AREA;
2 加大db_file_multiblock_read_count 一次物理读时返回的物理块
alter session set db_file_multiblock_read_count=512;
3 加大排序读时一次返回的物理块数?
alter session set "_sort_multiblock_read_count"=128;
对这些Session级参数的变化,会对系统造成哪些影响? 如果两个会话同时开启这些参数会有影响吗?
退出Session后,所有设置都失效.
########################################
相关的视图
########################################
1 v$sql_workarea_active
通过下如下视图可以知道,建立索引使用workarea_size时,分配的是否足够,可以用来在调整sort_area_size时做参考
select sql_id, to_char(sql_exec_start,'yyyymmdd hh24:mi:ss'), EXPECTED_SIZE, ACTUAL_MEM_USED,
NUMBER_PASSES,TEMPSEG_SIZE,TABLESPACE,SEGRFNO#,SEGBLK#,
operation_type, workarea_address, policy
from v$sql_workarea_active;