朋友在500w的表上建索引,半个小时都没有结束。所以就讨论如何提速。

一.先来看一下创建索引要做哪些操作:
1. 把index key的data 读到内存
==>如果data 没在db_cache 中,这时候很容易有大量的db file scatter read wait

2. 对index key的data 作排序
==>sort_area_size 或者pga_aggregate_target 不够大的情况下,需要做 disk sort, 会有大量的driect path read/write , 另外,消耗大量CPU Time

3. 创建新的index segment ,把排过序的index data 写到所创建的index segment 里面
==>如果index 很大,那么,有时也会有redo log 相关等待,如:
log buffer space ,log file sync , log file parallel write 等

所以,在建大表索引时,可以增大pga,增大temp tablepace,并且用nologging或并行选项。

如:
create index idx_logs on logs(time) nologging parallel 4;

并行度一般看CPU 个数。当然在CPU 比较空闲的情况下可以多并行几个。对于单CPU不建议用并行,这样反而会增加创建时间。也可以根据v$session_wait 的资料,做针对性的tuning , 这样可以降低点时间。

补充知识:

查看cpu 信息:more /proc/cpuinfo

查看内存信息:more /proc/meminfo

查看操作系统信息:more /etc/issue

有关索引概念性的东西,请参考我的Blog:

Oracle 索引 详解

http://blog.csdn.net/tianlesoftware/archive/2010/03/05/5347098.aspx

二. 测试

自己也测试了下。测试环境:Oracle 11g R2, win7 64bit ,CPU T6670 2.2G 双核, 内存:4G。

1. 查看表的数据量:

SQL> select count(*) from custaddr;

COUNT(*)

----------

7230464

2. 查看现有索引:

SQL> select index_name,index_type from user_indexes where table_name='CUSTADDR';

INDEX_NAME                     INDEX_TYPE

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

PK_CUSTADDR_TP_723             NORMAL

IX_CUSTADDR_ADDRABB_TP         NORMAL

IX_CUSTADDR_TEAMID_TP          NORMAL

IX_CUSTADDR_CUSTID_TP          NORMAL

IX_CUSTADDR_COMPABB_TP         NORMAL

IX_CUSTADDR_AREACODE           NORMAL

IX_CUSTADDR_ADDR_TP            NORMAL

已选择7行。

3. 删除索引:IX_CUSTADDR_CUSTID_TP

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

4. 默认方式创建索引:

SQL> SET timing on;

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID );

索引已创建。

已用时间:  00: 00: 48.37

单位:s

5. 用nologging 模式:
SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.09
SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID )  NOLOGGING;

索引已创建。

已用时间:  00: 00: 34.46

6. Nologging+ parallel 模式

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.17

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID )  NOLOGGING PARALLEL 2;

索引已创建。

已用时间:  00: 00: 52.56

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.07

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID )  NOLOGGING PARALLEL 4;

索引已创建。

已用时间:  00: 00: 53.44

看来在单CPU上,并行效果还不好.

7. Parallel 模式

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.02

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID ) PARALLEL 2;

索引已创建。

已用时间:  00: 00: 49.97

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.02

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID ) PARALLEL 4;

索引已创建。

已用时间:  00: 00: 50.25

从上面的测试数据可以看出,700万的数据,建索引,也在1分钟以内。 但是并行在单CPU上效果不明显,而且比光使用NOLOGGING还要慢,因为出现资源争用了,可能是CPU的争用,也可能是I/O的争用。

转: http://blog.csdn.net/tianlesoftware/article/details/5664019

如何加快建 index 索引 的时间的更多相关文章

  1. PLSQL_性能优化系列01_Oracle Index索引

    2014-06-01 Created By BaoXinjian

  2. MySQL查询优化之 index 索引的分类和使用

    索引的分类 主键索引 (PRIMARY KEY) 唯一的标识符, 主键不可重复, 只能有一列作为主键 唯一索引 (Unique KEY) 避免重复的列出现, 唯一索引可以重复, 多个列都可以标识为唯一 ...

  3. SAP建数据库索引

    [转]SAP建数据库索引   %_hints  db6 'INDEX("MKPF","MKPF~BUD")'           db6 'INDEX(&quo ...

  4. SQL Server获取索引创建时间&重建时间&重组时间

    之前写过一篇博客"SQL Server中是否可以准确获取最后一次索引重建的时间?",里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild ...

  5. Neo4j:Index索引

    Indexing in Neo4j: An Overview by Stefan Armbruster · Jan. 06, 14 · Java Zone Neo4j是一个图数据库,在做图的检索时,用 ...

  6. nexus私服update repair index索引失败解决方案(转)

    转载地址:http://blog.csdn.net/first_sight/article/details/51559086 问题描述: 搭建Maven的Nexus私服仓库,一般安装完Nexus后,默 ...

  7. 加NONCLUSTERED INDEX索引,在ON了之后还要INCLUDE

    之前加了索引,但效果不大 SET STATISTICS TIME ON --执行时间 SET STATISTICS IO ON --IO读取 DBCC DROPCLEANBUFFERS --清除缓冲区 ...

  8. py-day1-6 python 5个灰魔法 【len,index索引,for循环,切片】

    # 索引,下标,获取字符串中的某一个字符. test = 'MuMingJun' v = test[3] print(v) i # 切片 test = 'MuMingJun' v = test[0:- ...

  9. index索引的一些简单理解

    index索引(普通索引,允许出现相同的索引内容) 1.索引 索引是在数据量和访问量较大的时候,而出现的一种优化数据库的手段 索引可以提高查询(select)的效率,但相应的,它的 INSERT 与 ...

随机推荐

  1. jQuery--基础(操作标签)

    jQuery-样式操作 .css() 可以直接使用来获取css的值   .css("color")     使用方法,如果想给查找到的标签添加样式: .css("colo ...

  2. Django之通过tag推荐文章

    #路由 views.py def post_detail(request,year,month,day,post): ''' 文章详情 + 评论详情 :param request: :param ye ...

  3. 树莓派 CPU & 主板 温度

    CPU cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}' 主板 /opt/vc/bin/vcgencmd measur ...

  4. XMLHttpRequest cannot load ''. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' ' is therefore not allowed access.

    ajax跨域 禁止访问! 利用Access-Control-Allow-Origin响应头解决跨域请求

  5. 【特征匹配】SIFT原理与C源代码剖析

    相关: KD树+BBF算法解析 SURF原理与源代码解析 SIFT的原理已经有非常多大牛的博客上做了解析,本文重点将以Rob Hess等人用C实现的代码做解析,结合代码SIFT原理会更easy理解.一 ...

  6. KVM+VNC 虚拟机远程管理

    1.安装kvm grep -E -o 'vmx|svm' /proc/cpuinfo #检查服务器是否支持虚拟化(vmx为interl平台.svm是AMD平台) #安装KVM所需软件包: yum gr ...

  7. string去空格

    众所周知,string字符串去除空格的方法有trim()和replace(),区别在于trim()去首尾的空格,但是不能去中间的,而replace可以去除所有的空格. string data1=&qu ...

  8. 如何编译文件(gcc + nasm)

    [0]README 编译文件(nasm + gcc),特别是编译目标文件的依赖文件:本文旨在回顾 gcc 和 nams 编译器的编译命令,以及如果有多个依赖文件该如何编译: [1]编译文件 1.1)编 ...

  9. TCP交换数据流——Nagle算法简单记录

    Nagle算法: 该算法提出的目的是想解决网络中大量的小的TCP数据包造成网络拥塞的问题,举个例子,当客户端要发送一个字节的TCP数据包到服务器时,我们实际上产生了41字节长的分组:包括20字节的IP ...

  10. Vue 填坑系列(持续更新...)

    1.遇到页面显示不更新,数据已更新情况 vue-cli中: this.$nextTick(function () { this.x=x; })     以js引入vue的网页中: this.$set( ...