基本信息情况:

数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

操作系统版本:CentOS release 5.6

加快创建索引速度主要从一下角度考虑:

使用nologging 参数

使用parallel 并行参数

在session级别使用manual pga,手动调整sort_area_size

修改其他参数

注意:我们这里不手动调整hash_area_size,hash_area_size 默认情况下会自动根据sort_area_size*2来调,导致sort_area_size不能超过1G。所以我们这里直接调整sort_area_size参数。

这里首先记录pga使用的情况,9i以后查询pga分配和使用可以查询v$pgastat视图。

SQL> desc v$pgastat;

名称

--------------------------------

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> desc v$session_longops

名称 是否为空? 类型

----------------------------------------- -------- ----------------

SID NUMBER

SERIAL# NUMBER

OPNAME VARCHAR2(64)

TARGET VARCHAR2(64)

TARGET_DESC VARCHAR2(32)

SOFAR NUMBER

TOTALWORK NUMBER

UNITS VARCHAR2(32)

START_TIME DATE

LAST_UPDATE_TIME DATE

TIME_REMAINING NUMBER

ELAPSED_SECONDS NUMBER

CONTEXT NUMBER

MESSAGE VARCHAR2(512)

USERNAME VARCHAR2(30)

SQL_ADDRESS RAW(4)

SQL_HASH_VALUE NUMBER

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索引大小暴增_oracle海量数据中提升创建索引的速度相关推荐

  1. oracle索引大小暴增_oracle 如何预估将要创建的索引的大小

    一.1oracle 如何预估将要创建的索引的大小 oracle 提供了2种可以预估将要创建的索引大小的办法: ①  利用包 Dbms_space.create_index_cost 直接得到 ②  利 ...

  2. oracle索引大小暴增_Oracle创建索引前估算索引大小(dbms_space.create_index_cost)

    Oracle 创建索引前估算索引大小,在一个表的某个字段创建索引前估算其大小,最好的办法就是在测试库创建索引做预测.如果没有测试 Oracle 创建索引前估算索引大小 在一个表的某个字段创建索引前估算 ...

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

    基本信息情况: 数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 操作系统版本:Ce ...

  4. MySQL~索引设计原则:适合创建索引的11种情况、不适合创建索引的7种情况

    文章目录 数据的准备 适合创建索引 不适合创建索引 数据的准备 #1. 数据的准备CREATE DATABASE atguigudb1;USE atguigudb1;#1.创建学生表和课程表 CREA ...

  5. 【索引】:如何在海量数据中快速查找某个数据?

    亲测可用,若有疑问请私信 在[B+树]:MySQL数据库索引是如何实现的?中,我们讲了MySQL数据库索引的实现原理.MySQL底层依赖的是B+树这种数据结构.那类似Redis这样的Key-Value ...

  6. Oracle统计大小语句(用户、表、分区表、索引等)

    查询整个数据库剩余和使用的表空间大小使用情况 SELECT df.tablespace_name "表空间名",totalspace "总空间M",freesp ...

  7. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  8. kibana 更新 索引模式_elasticsearch – 如何在kibana中自动配置索引模式

    是否可以在kibana中自动配置索引模式?通过一些设置文件或者休息api.安装后,可以手动完成. Kibana 5.x公开了这样一个API来管理索引模式. 要创建索引模式,可以向kibana访问URL ...

  9. java 建立索引_java中怎么创建索引

    java中创建索引的方法:首先把对象转换为JSON字符串:然后把json文档写入索引:最后使用Java代码新建一个Java项目,在其中写好创建索引代码调用就可以了. 索引是与表或视图关联的磁盘上结构, ...

最新文章

  1. BPW34F红外光电传感器
  2. mysql5.6 错误日志_MySQL5.6.36 日志文件之错误日志,二进制日志,慢日志
  3. ArcGIS注册SDE库数据源
  4. 《Haskell函数式编程入门》——导读
  5. 多个php 链接数据库,ThinkPHP实现多数据库连接的解决方法
  6. Intellj IDEA 注册码 2018
  7. #pragma once 和 #ifndef ... #define ... #endif 的区别
  8. webpack教程——css的加载
  9. 微信小程序获取当前地理位置中文_微信小程序获取位置信息
  10. 算法导论8-5习题解答(平均排序)
  11. 【系统集成项目管理工程师】—计算真题公式汇总及分析
  12. python内置函数dict()
  13. 2008中国优秀无线互联网站点50强
  14. 955 互联网公司白名单来了!
  15. UI设计师求职中常被问到的13个面试题及答案总结
  16. 一个故事轻松记忆常见252个英语字根(1~30)
  17. python内置对象相关方法汇总
  18. 支持安卓与iphone13和安卓手机的5W无线充电芯片IC
  19. Docker 大势已去,Podman 即将崛起
  20. \t\t门萨智商测试 有些面试的公司喜欢玩这个

热门文章

  1. ios 动画 隐藏tabbar_iOS_自定义转场TabBar的隐藏动画
  2. git代码库迁移保留commit历史_如何把git仓库(包含所有提交历史)迁移到gitlab
  3. ~~约数之和(附模板题)
  4. 【有趣】Python之禅
  5. R语言中识别和去除重复行
  6. 如何终止Java线程
  7. HtmlUnit初探
  8. 使用github+hexo搭建静态博客
  9. React 记坑 ----- 关于 react-redux 中共享状态更新时自动重新 render 页面的问题
  10. 重置Mysql自增列的开始序号