`
duoerbasilu
  • 浏览: 1514167 次
文章分类
社区版块
存档分类
最新评论

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海量数据中提升创建索引的速度.docx

    "Oracle 海量数据中提升创建...为了提高 Oracle 海量数据中的创建索引速度,可以从多方面入手,包括使用 nologging 参数、parallel 并行参数、manual pga 模式等。同时,调整pga的参数和了解pga的工作机制也很重要。

    如何处理海量数据

    4. **建立索引**:为大表建立合适的索引可以加快查询速度,但要注意避免对频繁更新的表过度使用索引,适时调整索引的填充因子和类型。 5. **缓存管理**:在处理大量数据时,缓存机制是必不可少的。正确设置缓存大小...

    让Oracle跑得更快2:基于海量数据的数据库设计与.pdf

    2. **索引策略**:根据查询模式创建有效的索引,以加快查询速度。同时,需定期维护索引,防止其碎片化导致性能下降。 3. **分区与子分区**:对大数据量的表进行水平或垂直分区,可以显著提高查询性能。 4. **数据...

    基于Oracle数据库海量数据的查询优化研究.pdf

    本文主要探讨了 Oracle 数据库海量数据的查询优化研究,通过对 Oracle 数据库的分析,讨论了分页查询技术、SQL 语句优化、索引技术等查询优化方法,并对 Oracle 数据库的设计和实现进行了深入探析。 Oracle 数据库...

    海量数据环境下的Oracle数据库系统架构设计和优化思路

    ### 海量数据环境下Oracle数据库系统架构设计与优化思路 #### 一、分布式数据库系统架构设计 在海量数据处理环境中,传统的单机数据库系统已经难以满足高性能和高可用性的需求。因此,分布式数据库系统成为了一种...

    基于Oracle数据库海量数据的查询优化研究 (1).pdf

    3. 索引技术:根据表列创建索引,加快数据排序和查询速度。然而,索引维护、多表连接操作的耗时以及错误索引可能导致性能下降,需要谨慎处理。 【分页查询技术】 在Oracle数据库中,分页查询是用于处理大规模数据...

    海量数据处理分析方法

    Oracle、DB2和SQL Server 2005等都是处理海量数据的优秀选择,它们提供了高性能、高并发和大规模数据存储的能力。在BI(商业智能)领域,ETL(抽取、转换、加载)工具如Informatica和多维数据库如Essbase等,可以...

    基于软件开发的海量数据处理.pdf

    但创建索引也会带来额外的系统开销,因此需要根据实际查询需求进行权衡。 其次,Oracle数据库的并行处理技术在处理海量数据时能有效提升系统性能。通过设置对象的并行度属性或使用Hint方式显式执行,可以将任务分解...

    处理百万级以上的数据提高查询速度的方法

    以下是从标题、描述、标签以及部分内容中提炼出的关键知识点,这些技巧可以帮助你在面对海量数据时提升SQL查询的速度。 #### 1. 避免使用 `!=` 或 `<>` 运算符 - **建议**: 在WHERE子句中避免使用 `!=` 或 `<>`,...

    ORACLE数据仓库建设.docx

    - **索引优化**: 创建合适的索引以加快查询速度。 - **查询优化**: 调整SQL语句,减少不必要的数据扫描。 - **硬件升级**: 增加内存、磁盘空间等资源,提高系统处理能力。 通过以上详尽的分析和设计,可以构建一个...

    浅述asp.net海量分页数据存储过程

    2. 创建适当的索引,加快数据检索速度。 3. 缓存页面结果,避免重复计算。 4. 考虑使用懒加载(或延迟加载)技术,只有在用户滚动到页面底部时才加载更多数据。 总结来说,ASP.NET海量分页数据存储是一个涉及服务器...

    oracle分区技术-大批量数据操作.pptx

    Oracle的分区技术是一种高效的数据管理策略,特别是在处理大数据量时,能够显著...总的来说,Oracle的分区技术是大型数据库环境中不可或缺的数据管理工具,它可以帮助企业有效地处理海量数据,提高系统的稳定性和效率。

    Oracle Exadata X2 数据库一体机

    2. 存储索引:在存储层创建索引,加快查询速度。 3. FlashCache:利用SSD作为高速缓存,加速数据读取。 4. 集成备份:Exadata支持直接集成Oracle RMAN备份,简化备份流程并提升效率。 五、Exadata的应用场景 1. ...

    Oracle数据库SQL语句的性能优化.pdf

    正确创建和使用索引,可以显著加快数据检索速度。在Oracle中,有B树索引、位图索引、函数索引等多种类型,应根据查询模式选择合适的索引类型。同时,避免在索引列上进行不等值、范围查询或使用NOT运算符,这可能导致...

    ORACLE9I物化视图

    然而,在海量数据中及时准确地查找并呈现这些信息往往是一个重大挑战。为了应对这一挑战,Oracle 9i 引入了物化视图的概念,这是一种用于快速访问和报告数据的有效手段。 #### 引言 物化视图最早在 Oracle 8i 中...

    oracle入门教程

    4. 备份与恢复:Oracle提供高级的备份和恢复功能,减少数据丢失风险,加快故障修复速度。 5. 空间管理:用户可以灵活分配和控制磁盘空间。 6. 开放式连接:支持与其他软件的接口,实现跨系统集成。 在学习Oracle时...

    海量数据库的查询优化及分页算法方案

    在海量数据场景下,合理选择和使用索引是提高查询速度的关键。例如,对于频繁访问的数据字段,创建聚集索引可以显著提升检索效率;而对于需要多字段联合查询的场景,则可能需要考虑复合索引(compound index)来满足...

    浅谈超大型Oracle数据库的基础设计和优化设计.pdf

    Oracle数据库是一种广泛应用于商业领域的大型关系型数据库管理系统,它由美国甲骨文公司开发,以其强大的数据处理能力和海量数据存储而著称。由于其优越的性能,在处理大型数据集时被越来越多的用户采纳,并成为众多...

    数据库大批量数据导入excle

    - **索引利用**:导入前分析数据,创建合适的索引,加快查询速度。 4. **性能调优**: - **批量大小**:适当调整批量插入的大小,太小会增加系统开销,太大可能超出内存限制,需要根据系统资源和数据量找到最佳...

Global site tag (gtag.js) - Google Analytics