当前位置:Gxlcms > 数据库问题 > oracle海量数据中提升创建索引的速度

oracle海量数据中提升创建索引的速度

时间:2021-07-01 10:21:17 帮助过:3人阅读

  • 名称   
  • --------------------------------  
  • NAME 名称   
  • VALUE 值   
  • UNIT 单位   
  • -------------------统计项   
  • select * from v$pgastat  
  • NAME                                          VALUE UNIT  
  • ---------------------------------------- ---------- ----------  
  • aggregate PGA target parameter            150994944 bytes   
  • aggregate PGA auto target                  93579264 bytes  
  • global memory bound                        30198784 bytes  
  • total PGA inuse                            47017984 bytes  
  • total PGA allocated                        56666112 bytes  
  • maximum PGA allocated                      58632192 bytes  
  • total freeable PGA memory                   2883584 bytes  
  • process count                                    23  
  • max processes count                              48  
  • PGA memory freed back to OS                 5177344 bytes  
  • total PGA used for auto workareas                 0 bytes  
  • maximum PGA used for auto workareas               0 bytes  
  • total PGA used for manual workareas               0 bytes  
  • maximum PGA used for manual workareas             0 bytes  
  • over allocation count                             0  
  • bytes processed                             6438912 bytes  
  • extra bytes read/written                          0 bytes  
  • cache hit percentage                            100 percent  
  • recompute count (total)                         123  
  •  

     

    对于上面的解释如下

    1 aggregate PGA target parameter 150994944 bytes : pga_aggregate_target
    2 aggregate PGA auto target 93579264 bytes : 剩余的能被工作区使用的内存。
    3 global memory bound 30198784 bytes :单个SQL最大能用到的内存
    4 total PGA inuse 47017984 bytes :正被耗用的pga(包括workare pl/sql等所有占用的pga)
    5 total PGA allocated 56666112 bytes :当前实例已分配的PGA内存总量。
    一般来说,这个值应该小于 PGA_AGGREGATE_TARGET ,
    但是如果进程需求的PGA快速增长,它可以在超过PGA_AGGREGATE_TARGET的限定值
    6 maximum PGA allocated 58632192 bytes :pga曾经扩张到的最大值
    7 total freeable PGA memory 2883584 bytes :可释放的pga
    8 process count 23 :当前process
    9 max processes count 48 :最大时候的process
    10 PGA memory freed back to OS 5177344 bytes
    11 total PGA used for auto workareas 0 bytes :当前auto模式下占用的workara size 大小
    12 maximum PGA used for auto workareas 0 bytes :auto模式下占用的workara size最大 大小
    13 total PGA used for manual workareas 0 bytes :当前manual模式下占用的workara size 大小
    14 maximum PGA used for manual workareas 0 bytes :manual模式下占用的workara size最大 大小
    15 over allocation count 0 :使用量超过pga大小的次数
    16 bytes processed 6438912 bytes :pga使用的字节
    17 extra bytes read/written 0 bytes :向临时段写的字节
    18 cache hit percentage 100 percent :bytes processed/(bytes processed+extra bytes read/written)
    19 recompute count (total) 123 

    global memory bound:一个串行操作能用到的最大内存
    =min(5%*pga_aggregate_target,50%*_pga_max_size,_smm_max_size),
    当你修改参数pga_aggregate_target的值时,Oracle系统会根据pga_aggregate_target和_pga_max_size
    这两个值来自动修改参数_smm_max_size。具体修改的规则是:
    如果_pga_max_size大于5%*pga_aggregate_target,则_smm_max_size为5%*pga_aggregate_target。
    如果_pga_max_size小于等于5%*pga_aggregate_target,则_smm_max_size为50%*_pga_max_size。

    total PGA in used:当前正在使用的PGA,可以从v$process的pga_used_mem字段中获取
    select sum(a.PGA_USED_MEM),sum(a.PGA_ALLOC_MEM),sum(a.PGA_MAX_MEM) from v$process a
    v$pgastat 中的 total PGA in used、total PGA allocated、maximum PGA allocated
    这3个值差不多

     

    在执行创建索引前,我们还要介绍一个视图v$session_longops视图

     

    [sql] view plaincopy  
    1. SQL> desc v$session_longops  
    2. 名称 是否为空? 类型  
    3. ----------------------------------------- -------- ----------------  
    4.   
    5. SID NUMBER  
    6. SERIAL# NUMBER  
    7. OPNAME VARCHAR2(64)  
    8. TARGET VARCHAR2(64)  
    9. TARGET_DESC VARCHAR2(32)  
    10. SOFAR NUMBER  
    11. TOTALWORK NUMBER  
    12. UNITS VARCHAR2(32)  
    13. START_TIME DATE  
    14. LAST_UPDATE_TIME DATE  
    15. TIME_REMAINING NUMBER  
    16. ELAPSED_SECONDS NUMBER  
    17. CONTEXT NUMBER  
    18. MESSAGE VARCHAR2(512)  
    19. USERNAME VARCHAR2(30)  
    20. SQL_ADDRESS RAW(4)  
    21. SQL_HASH_VALUE NUMBER  
    22. QCSID NUMBER  

    其中SID和SERIAL#是与v$session中的匹配的,
    OPNAME:指长时间执行的操作名.如:Table Scan
    TARGET:被操作的object_name. 如:tableA
    TARGET_DESC:描述target的内容
    SOFAR:这个是需要着重去关注的,表示已要完成的工作数,如扫描了多少个块。
    TOTALWORK:指目标对象一共有多少数量(预计)。如块的数量。
    UNITS:
    START_TIME:进程的开始时间
    LAST_UPDATE_TIM:最后一次调用set_session_longops的时间
    TIME_REMAINING: 估计还需要多少时间完成,单位为秒
    ELAPSED_SECONDS:指从开始操作时间到最后更新时间
    CONTEXT:
    MESSAGE:对于操作的完整描述,包括进度和操作内容。
    USERNAME:与v$session中的一样。
    SQL_ADDRESS:关联v$sql
    SQL_HASH_VALUE:关联v$sql
    QCSID:主要是并行查询一起使用。

     

    下面测试正式开始

     

    1、使用python脚本创建随机数

     

    import random

    ‘‘‘

    Created on 2012-3-26

     

    @author: jscn-xw

    ‘‘‘

    for j in range(1,10):

       for i in range(1,10000000):

           print random.randint(100000000,999999999),random.randint(100000000,999999999)

     

    2、创建测试表

    SQL> create table tbim(id1 number,id2varchar2(12)) nologging;

     

    3、load进入数据

    3.1 创建控制文件(tbim.ctl)

    load data

    --infile ‘/home/oracle/bi_logfile.txt‘

    into table tbim

    append

    fields terminated by ‘ ‘

    OPTIONALLY ENCLOSED BY ‘"‘

    trailing nullcols

    (

     id1       ,

      id2

    )

    3.2 sqlldr进入数据库

    [oracle@jscns-05CTL]$ sqlldr userid=security/security control=tbim.ctldata=/home/oracle/tbim.bcp

     

    4 测试

    SQL> set timing on

    SQL> select count(*) from tbim ;

     

     COUNT(*)

    ----------

     400000000

     

    Elapsed: 00:00:06.57

    4.1 什么参数都不加测试创建速度

    SQL> create index id1_ind on tbim(id1) tablespace imindex;

     

    Index created.

     

    Elapsed: 00:16:23.51

     

    这个时候注意观察临时表空间的变化情况,我们注意临时表空间在不断的增加。还要注意v$session_longops视图的变化。

    主要关注SOFAR、TIME_REMAINING、ELAPSED_SECONDS字段的变化和值

     

    4.2 加上nologing参数

    SQL> drop index id1_ind;

     

    SQL> create index id1_ind on tbim(id1)tablespace imindex nologging;

     

    Index created.

     

    Elapsed: 00:16:40.20

     

    4.3 加上parallel参数

    SQL> drop index id1_ind;

    SQL> create index id1_ind on tbim(id1)tablespace imindex nologging parallel 4;

     

    Index created.

     

    Elapsed: 00:09:03.74

     

    感觉parallel不靠谱,而且nologging效果也不是很明显,至少对于oracle11gR2来说。

     

    4.4 调整sort_area_size

    SQL> alter session setworkarea_size_policy=manual;

    SQL> alter session setworkarea_size_policy=manual;

    SQL> alter session setsort_area_size=2000000000;

    SQL> alter session setsort_area_size=2000000000;

    SQL> create index id1_ind on tbim(id1)tablespace imindex nologging parallel 4;

    Index created.

     

    Elapsed: 00:08:12.79

    这个效果还是比较明显的

     

     

    4.5 修改其他参数

    修改全表扫描时一次读取的block的数量db_file_multiblock_read_count

    直接路径IO的大小,10351 event level 128

    禁用block checksum/checking

    备选的排序算法_newsort_type

    SQL> alter session setdb_file_multiblock_read_count=1024;

    SQL> alter session setdb_file_multiblock_read_count=1024;

    SQL> alter session set events ‘10351trace name context forever, level 128‘;

    SQL> alter session setsort_area_size=2000000000;

    SQL> alter session setsort_area_size=2000000000;

    SQL> alter session set"_sort_multiblock_read_count"=128;

    SQL> alter session set"_sort_multiblock_read_count"=128;

    SQL> alter session enable parallel ddl;

    SQL> alter session setdb_block_checking=false;

    SQL> alter system setdb_block_checksum=false;

     

    SQL> create index id1_ind on tbim(id1)tablespace imindex nologging parallel 4;

     

    Index created.

     

    Elapsed: 00:07:37.57

    5、总结

    我可以通过以下手段加快创建索引速度:

    1)除此之外,还可以适当的调整并行查询的数量(一般不超过8);

    2)索引和表分离,单独的临时表表空间;

    3)把表调整为nologging状态,或者创建索引的时候指定nologging;

    4)我们可以适当调整数据库相关参数加快左右创建索引速度,示例如下:

    SQL> alter session setdb_file_multiblock_read_count=1024;

    SQL> alter session setdb_file_multiblock_read_count=1024;

    SQL> alter session set events ‘10351trace name context forever, level 128‘;

    SQL> alter session setsort_area_size=2000000000;

    SQL> alter session setsort_area_size=2000000000;

    SQL> alter session set"_sort_multiblock_read_count"=128;

    SQL> alter session set "_sort_multiblock_read_count"=128;

    SQL> alter session enable parallel ddl;

    SQL> alter session setdb_block_checking=false;

    SQL> alter system setdb_block_checksum=false;

     

    通过以上调整一般可以加快40%以上的创建速度

    oracle海量数据中提升创建索引的速度

    标签:

    人气教程排行