oracle海量数据中提升创建索引的速度
基本信息情况:
数据库版本: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海量数据中提升创建索引的速度的更多相关文章
- SQL server 表中如何创建索引?
SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...
- oracle 物化视图及创建索引
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...
- oracle 数据库中(创建、解锁、授权、删除)用户
上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...
- oracle查询中会使索引无效的情况总结
总结一下oracle中会使索引无效的情况 1 无where条件: 2 索引列进行运算时: 3 使用like,并且通配符在前的情况: 4 字符型字段为数字时在where条件里不添加引号: 5 not i ...
- 『PLSQL』在oracle表中怎样创建自增长字段?
1.建立测试数据表CREATE TABLE TEST( ID NUMBER, NAME VARCHAR2(20), PRIMARY KEY(ID)); 2.创建序列CREATE SEQUENCE SE ...
- oracle 创建索引思考(转)
在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了. 笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索 ...
- oracle数据库什么情况下创建索引比较好
索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽 然说,在表中 ...
- Oracle数据库中如何选择合适的索引类型 .
索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽然说,在表中是 ...
- Oracle数据泵导入的时候创建索引是否会使用并行?
一.疑问,Oracle数据泵导入的时候创建索引是否会使用并行? 某客户需要使用数据泵进行迁移,客户咨询导入的时间能不能加快一点. 那么如何加快导入的速度呢? 多加一些并行,那么创建索引内部的索引并行度 ...
随机推荐
- 【BZOJ4458】GTY的OJ
题面 Description 身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ.GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录是不会重叠的.比 ...
- ACM集训日志——day1——15.7.8
UVA 11292 The Dragon of Loowater 题意 给n个头,m个骑士,骑士有能力值x,代表他可以砍掉一个直径不超过x的头,并且佣金为x,求要砍掉所有的头,需要的最少佣金是多少. ...
- [LOJ6281]数列分块入门 5
题目大意: 给你一个长度为$n(n\leq50000)$的序列$A(0\leq A_i<2^{31})$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数开方: 2.询问区间$[l,r] ...
- 【转载】uboot的工具mkimage使用方法
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字 ...
- 一次快速改写 SQL Server 高效查询的范例
原文:一次快速改写 SQL Server 高效查询的范例 最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提 ...
- nginx服务器设置path_info模式
1.find / -name nginx.conf找到nginx配置文件 2. ## The default server#server { listen 80; #填写自己的域名 server_na ...
- iOS:新浪微博OAuth认证
新浪微博OAuth认证 1.资源的授权 •在互联网行业,比如腾讯.新浪,那用户人群是非常巨大的 •有时候要把某些用户资源共享出去,比如第三方想访问用户的QQ数据.第三方想访问用户的新浪微博数据 • ...
- Spring: aop自动标注时出现 “0 formal unbound in pointcut"
异常代码信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name forma ...
- 图文介绍openLDAP在windows上的安装配置
目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一].概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台 ...
- 配置php扩展memcache
配置php扩展memcache 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 php-5.5.38 ...