知识大全 如何高效online创建大表的索引

Posted 时间

篇首语:第一个青春是上帝给的;第二个的青春是靠自己努力的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何高效online创建大表的索引相关的知识,希望对你有一定的参考价值。

  Microsoft Windows [版本 ]

  (C) 版权所有 Microsoft Corp

  C:\\Documents and Settings\\Administrator>systeminfo

  主机名:           ORACLETEST

  OS 名称:          Microsoft(R) Windows(R) Server Enterprise Edition

  OS 版本:          Service Pack Build

  系统类型:         X based PC

  处理器:           安装了 个处理器

  [ ]: x Family Model Stepping GenuineIntel ~ Mhz

  [ ]: x Family Model Stepping GenuineIntel ~ Mhz

  物理内存总量:     MB

  可用的物理内存:   MB

  页面文件: 最大值: MB

  页面文件: 可用:   MB

  页面文件: 使用中: MB

  页面文件位置:     c:\\pagefile sys

  d:\\pagefile sys

  e:\\pagefile sys

  f:\\pagefile sys

  环境其实就是一台很普通的PC机

   双核的CPU+ G内存

   G的表

   W row的量

  目的:测试如何以最快的方式online建立索引

  C:\\Documents and Settings\\Administrator>sqlplus sys@FUTEST_ as sysdba

  SQL*Plus: Release Production on 星期五 月 : :

  Copyright (c) Oracle All rights reserved

  输入口令:

  连接到:

  Oracle Database g Enterprise Edition Release Production

  With the Partitioning OLAP Data Mining and Real Application Testing options

  SYS TEST SQL> set linesize

  SYS TEST SQL> set timing on

  SYS TEST SQL> set autot on

  SYS TEST SQL> alter session SET workarea_size_policy=MANUAL;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set sort_area_size= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set sort_area_retained_size= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set db_file_multiblock_read_count= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) parallel(degree ) ONLINE NOLOGGING;

  索引已创建

  已用时间: : :

  SYS TEST SQL>

  

  

  上面的测试用了 分钟

   对比下面的测试很晕

  设置的参数为

  sort_area_size= ;

  sort_area_retained_size= ;

  db_file_multiblock_read_count= ;

  还有并行系数

  

  

   查看当前的并行状况

  select decode(a QCSERIAL# null PARENT CHILD ) stmt_level

  a SID

  a SERIAL#

  b USERNAME

  b OSUSER

  b SQL_HASH_VALUE

  b SQL_ADDRESS

  a DEGREE

  a REQ_DEGREE

  from v$px_session a v$session b

  where a SID = b SID

  order by a QCSID stmt_level desc;

  C:\\Documents and Settings\\Administrator>sqlplus sys@futest_ as sysdba

  SQL*Plus: Release Production on 星期一 月 : :

  Copyright (c) Oracle All rights reserved

  输入口令:

  连接到:

  Oracle Database g Enterprise Edition Release Production

  With the Partitioning OLAP Data Mining and Real Application Testing options

  SYS TEST SQL> set timing on

  SYS TEST SQL> set linesize on

  SP : linesize 选项的编号无效

  SYS TEST SQL> set linesize

  SYS TEST SQL> set autot on

  SYS TEST SQL> CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING;

  索引已创建

  已用时间: : :

   什么都不设置的情况下 仅仅是online+nologging 才耗用了 分钟 当然 这是测试环境 整个DB没有模拟生产压力的

  SYS TEST SQL> drop index IX_ALOTPRM_MTRL_LOT_ID;

  索引已删除

  已用时间: : :

  SYS TEST SQL> alter session SET workarea_size_policy=MANUAL;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set sort_area_size= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set sort_area_retained_size= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set db_file_multiblock_read_count= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) parallel(degree ) ONLINE NOLOGGING;

  索引已创建

  已用时间: : :

   这次又用了 分钟

  sort_area_size= ;

  sort_area_retained_size= ;

  db_file_multiblock_read_count= ;

  并行系数 ;

  这测试结果太不稳定了 如果只要 分钟的话 !那直接用就是了 还整这么费劲干啥?

  咳咳 多测试几次吧 刨根问底~

  SYS TEST SQL> drop index IX_ALOTPRM_MTRL_LOT_ID;

  索引已删除

  我决定drop掉INDEX 然后回收tablespace再测试一次

  SYS TEST SQL> select sum(bytes)/ / / sumbytes

   from dba_extents a

   where tablespace_name= USERS

   /

  SUMBYTES

  

  

  SYS TEST SQL> select name round(to_number(bytes/ / / ) ) as bytes from v$datafile;

  NAME                                                    BYTES

  

  E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_SYSTEM   

  _ TJTP GN_ DBF

  E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_UNDOTB    

  S _ TJTP L _ DBF

  E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_SYSAUX    

  _ TJTP J _ DBF

  E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_USERS_        

   TJTP L _ DBF

  NAME                                                    BYTES

  

  E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_EXAMPL    

  E_ TJTR PY_ DBF

  收缩之~

  SYS TEST SQL> ALTER DATABASE DATAFILE E:\\ORACLE_DATA\\FUTEST\\FUTEST\\DATAFILE\\O _MF_USERS_ TJTP L _ DBF

   RESIZE M;

  数据库已更改

  接着继续~

  我想了想 会不会与这个测试DB的内存分配有关系?

  SYS TEST SQL> show sga

  Total System Global Area bytes

  Fixed Size                  bytes

  Variable Size             bytes

  Database Buffers          bytes

  Redo Buffers                bytes

  SYS TEST SQL> show parameter pga

  NAME                                 TYPE        VALUE

  

  pga_aggregate_target                 big integer M

  SYS TEST SQL>

  把参数改小点

   M+ DB_file_multiblock_read_count+并行

  sort_area_size= ;

  sort_area_retained_size= ;

  db_file_multiblock_read_count= ;

  还有并行系数

  把DB的内存分配得稍微大一点

  SYS TEST SQL> show sga

  Total System Global Area bytes

  Fixed Size                  bytes

  Variable Size             bytes

  Database Buffers          bytes

  Redo Buffers                bytes

  SYS TEST SQL> show parameter sga

  NAME                                 TYPE        VALUE

  

  lock_sga                             boolean     FALSE

  pre_page_sga                         boolean     TRUE

  sga_max_size                         big integer M

  sga_target                           big integer M

  SYS TEST SQL> show parameter pga

  SYS TEST SQL> CREATE INDEX FU_DB IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) parallel(degree ) ONLINE NOLOGGING;

  索引已创建

  已用时间: : :

  搞来搞去 还是整了 分钟

  再来一次 不并行看看如何~

  sort_area_size= ;

  sort_area_retained_size= ;

  db_file_multiblock_read_count= ;

  SYS TEST SQL> alter session SET workarea_size_policy=MANUAL;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set sort_area_size= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set sort_area_retained_size= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> alter session set db_file_multiblock_read_count= ;

  会话已更改

  已用时间: : :

  SYS TEST SQL> CREATE INDEX FU_DB IX_ALOTPRM_MTRL_LOT_ID on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING;

  索引已创建

  已用时间: : :

  再多测一次 再去吃饭

  删索引

  回收tablespace

  总结一下

  我很晕了 为什么不并行反而更快?

  我估计和具体的场景 硬件条件 系统并发负载 还是有所联系 不然大牛们一直都说大表建索引 必须

  session级别增大sort_area_size + nologging + 并行

  看样子 过段时间 找台 CPU的 再试试吧

  条件                                                                                                   时间

  

  手动 G+Multi block read count +并行

  workarea_size_policy=MANUAL;

  alter session set sort_area_size= ;

  alter session set sort_area_retained_size= ;                    : :

  alter session set db_file_multiblock_read_count= ;

  parallel(degree ) ONLINE NOLOGGING;

  

  啥事不干直接建

  CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID

  on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING;                 : :

  

  我手多 又测试了一遍第一种情况

  workarea_size_policy=MANUAL;

  alter session set sort_area_size= ;

  alter session set sort_area_retained_size= ;                    : :

  alter session set db_file_multiblock_read_count= ;

  parallel(degree ) ONLINE NOLOGGING;

  

  手动 M+Multi block read count +并行

  workarea_size_policy=MANUAL;

  sort_area_size= ;

  sort_area_retained_size= ;                              : :

  db_file_multiblock_read_count= ;

  parallel(degree ) ONLINE NOLOGGING;

  

  手动 M+Multi block read count +无并行 试试

  workarea_size_policy=MANUAL;

  sort_area_size= ;

  sort_area_retained_size= ;                                          : :

  db_file_multiblock_read_count= ;

  无并行

  

  再来一次手动 M+Multi block read count +无并行

  workarea_size_policy=MANUAL;

  sort_area_size= ;

  sort_area_retained_size= ;                                          : :

  db_file_multiblock_read_count= ;

  无并行

  

  再来一次啥事不干直接建

  CREATE INDEX IX_ALOTPRM_MTRL_LOT_ID

  on FU_DB ALOTPRM(MTRL_LOT_ID) ONLINE NOLOGGING;                       : :

  

  若是不并行的话 Process 里会看到一个 CPU使用蛮高的TID 而且只有一个核在激烈的WORK

  

  

  若是并行的话 这里会看到好几个PID在work

  

cha138/Article/program/Oracle/201311/17238

相关参考

知识大全 sql server如何识别真实和自动创建的索引

  问我发现sysindexes索引表中的很多条目并不是我自己创建的听说它们并不是真正的索引而是SQLServer查询优化器自动创建的统计怎样才能识别哪些是真正的索引哪些是SQLServer自动创建的

知识大全 创建索引选择合适的可选项

  有些新手在Oracle数据库中创建索引时往往不会使用可选项其实有时候在合适的场合使用一些可选项可以提高索引的创建速度如为了大批量导入数据我们往往会先取消索引其以提高插入的速度然后等数据导入完毕后再

知识大全 快速创建MyISAM索引

高性能MySQL:快速创建MyISAM索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  快速创

知识大全 SQLSERVER 创建索引实现代码

SQLSERVER创建索引实现代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz

知识大全 当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗

当我正在为表建立索引的时候,SQLServer会禁止对表的访问吗?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一

知识大全 关于Sphinx创建全文检索的索引介绍

关于Sphinx创建全文检索的索引介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  全文检索的

知识大全 在Oracle中合理创建数据库的索引

在Oracle中合理创建数据库的索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Oracl

知识大全 如何解决不能一次创建多表的问题

  一次操作创建多个对象一个不成功则全部不成功    第一步创建用户      createuseraa      identifiedbyaa      defaulttablespaceusers

知识大全 阻止保存要求重新创建表的更改 sqlserver 2008

  当用户在在SQLServer企业管理器中更改表结构时必须要先删除原来的表  然后重新创建新表才能完成表的更改如果强行更改会出现以下提示不允许保存更改  您所做的更改要求删除并重新创建以下表您对无法

知识大全 查找 - 线性表的查找 - 分块查找

  分块查找  分块查找(BlockingSearch)又称索引顺序查找它是一种性能介于顺序查找和二分查找之间的查找方法  二分查找表存储结构  二分查找表由分块有序的线性表和索引表组成  ()分块有