oracle大表创建索引
时间:2014-06-30 11:06:36 作者:beebol 标签: 分类: Oracle
20多亿条数据,需要在线添加索引。如下是添加索引遇到的问题及方法:
服务器cpu:24 core 124G内存
数据库构架:primary--standby
开始创建,通过parallel参数进行多进程添加。
SQL> set timing on SQL> CREATE INDEX tlbb.IND_SERVER_LOG_PUTDATE ON tlbb.TLBB_SERVER_LOG(PUT_DATE) 2 TABLESPACE TLBB_INDEX parallel 15 online; CREATE INDEX tlbb.IND_SERVER_LOG_PUTDATE ON tlbb.TLBB_SERVER_LOG(PUT_DATE) * ERROR at line 1: ORA-01652: unable to extend temp segment by 128 in tablespace TEMPElapsed: 00:45:41.53 Elapsed: 00:45:41.53
第一次添加失败了,原因是temp表空间不够,导致失败。
SQL> select file_name,bytes/1024/1024 "MB",autoextensible,tablespace_name from dba_temp_files; FILE_NAME -------------------------------------------------------------------------------- MB AUT TABLESPACE_NAME ---------- --- ------------------------------ +DATA/sgstatdb3/tempfile/temp.910.840550051 32767.9844 YES TEMP +DATA/sgstatdb3/tempfile/temp.909.840550051 6144 YES TEMP Elapsed: 00:00:00.13 SQL> set linesize 200; SQL> select file_name,bytes/1024/1024 "MB",autoextensible,tablespace_name from dba_temp_files; FILE_NAME -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- MB AUT TABLESPACE_NAME ---------- --- ------------------------------ +DATA/sgstatdb3/tempfile/temp.910.840550051 32767.9844 YES TEMP +DATA/sgstatdb3/tempfile/temp.909.840550051 6144 YES TEMPElapsed: 00:00:00.11 Elapsed: 00:00:00.11
添加表空间文件,根据表的数据量,添加相应的临时表空间数据文件:本次我添加了7个:防止再次出现临时表空间不足问题。
alter tablespace TEMP add tempfile '+DATA' size 50M AUTOEXTEND ON next 1M maxsize unlimited;
第一次将parallel设置为15,服务器的负载没有太多变化,正常情况下。该服务器支持48个parallel。但是不能开太高,不然影响线上业务。
SQL> CREATE INDEX tlbb.IND_SERVER_LOG_PUTDATE ON tlbb.TLBB_SERVER_LOG(PUT_DATE) TABLESPACE TLBB_INDEX parallel 20 online; Index created.Elapsed: 01:43:39.36 Elapsed: 01:43:39.36
这次将parallel添加到了20,终于经过了1小时43分钟,索引终于创建完了。
如果没有配置standby的情况下,再加个nologging又会再快很多。有standby了就不行了,因为已经force logging了。