一.Rebuild 索引 与 并行度 说明

在之前的Blog里整理了一些列有关索引相关的Blog,如下:

 

如何加快建index 索引 的时间

​http://www.cndba.cn/Dave/article/1163​

 

Oracle 索引扫描的五种类型

​http://www.cndba.cn/Dave/article/1574​

 

Oracle 索引的维护

​http://www.cndba.cn/Dave/article/1157​

 

Oracle alterindex rebuild 与ORA-08104 说明

​http://www.cndba.cn/Dave/article/510​

 

在索引create 和rebuild的时候,在CPU 允许的情况下,我们可以使用parallel来加快操作的速度。但是这里有一个注意的问题,有关索引的并行度,这个对表同样要注意。

 

对于OLTP类型的数据库,除非只用于做统计、报表类的表或索引,建议不对相关表或索引调置并行度。在数据库有开启并行查询的情况下,在表或索引上存在默认并行度,将导致数据库优先采用全表或全索引扫描的执行计划,另外将生成多个并行子进程,对于OLTP类应用将反而降低相关SQL的执行效率。

 

       有关parallel,官网的说明如下:

​http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_7002.htm#i2159323​

 

The parallel_clause letsyou parallelize creation of the table and set the default degree of parallelismfor queries and the DML INSERT, UPDATE, DELETE,andMERGE after table creation.

 

(1)    NOPARALLEL: Specify NOPARALLEL forserial execution. This is the default,即并行度为1.

 

(2)PARALLEL:


(3)PARALLEL integer:

 

       Oracle在并行处理时,会启动多少个并行进程来同时执行任务,并行度越高, 并行进程越多,执行速度 会越快,默认是noparallel,如果我们设置并行度为default值,那么此时的并行度是:

服务器CPU数*每个CPU启用的线程数(PARALLEL_THREADS_PER_CPU)

 

       所以一般我们建议使用Noparallel,或者将并行度设置为1,而不是default。

 

       可以通过dba_tables 和 dba_indexes 视图的degree 字段来查看相关对象的并行度。

 

要注意的就是在我们用并行来rebuild索引的时候,rebuild结束后,我们索引的并行度也会改成我们rebuild的并行度,所以在我们rebuild 结束之后还需要对索引的并行度进行一个修改操作。

 

 

二.示例

测试环境: win7 +oracle 11.2.0.1

 

SQL> select * from v$version where rownum=1;

 

BANNER

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

Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - 64bit Production

 

 

--查看并行参数:

SQL> show parameter parallel_max_servers

 

NAME                                 TYPE        VALUE

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

parallel_max_servers                 integer     20

 

SQL> show parameter PARALLEL_THREADS_PER_CPU

 

NAME                                 TYPE        VALUE

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

parallel_threads_per_cpu             integer     2

 

 

--测试表Dave信息:

SQL> select count(*) from dave;

 

 COUNT(*)

----------

333798

 

SQL> col segment_name for a15

SQL> l

  1*select segment_name,bytes/1024/1024||'M' as "size" from dba_segmentswhere segment_name='DAVE' and owner='SYS'

SQL> /

 

SEGMENT_NAME    size

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

DAVE            38M

 

 

--使用默认值创建索引:

SQL> create index idx_dave_id on dave(object_id) ;

Index created.

SQL>

 

--查看默认值:

SQL> select degree from dba_indexes where index_name='IDX_DAVE_ID';

 

DEGREE

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

1

--这里默认为noparallel,即为1.

 

 

--使用并行度为4,对索引进行rebuild:

SQL> ater index idx_dave_id rebuildparallel 4;

Index altered.

 

--在次查看索引的并行度:

SQL> select degree from dba_indexes where index_name='IDX_DAVE_ID';

 

DEGREE

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

4

 

注意:

这里变成了4,也就是说启用了索引自己的并行,这样在我们使用索引时会影响执行计划,也会消耗很多的资源。所以,我们需要对这个并行度进行修改,改成noparallel。

 

--修改并行度为noparallel:

SQL> alter index idx_dave_id noparallel;

Index altered.

 

--查看并行度:

SQL> select degree from dba_indexes where index_name='IDX_DAVE_ID';

 

DEGREE

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

1

 

这里又变成了1.

 

 

使用并行来处理时,我们可以通过v$px_session 来查看相关的等待事件:

SQL> select a.sql_id,a.event,count(*)from v$session a,v$px_session b where a.sid=b.sid group by a.sql_id,a.event;

 

 

 

关于并行的更多测试参考:

OracleParallel Execution(并行执行)


​http://www.cndba.cn/Dave/article/1573​


 

 

 

 

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

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog:  ​http://www.cndba.cn/dave

Weibo: ​​http://weibo.com/tianlesoftware​

Twitter: ​​http://twitter.com/tianlesoftware​

Facebook: ​​http://www.facebook.com/tianlesoftware​

Linkedin: ​​http://cn.linkedin.com/in/tianlesoftware​

 

 

-------加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请----

DBA1 群:62697716(满);   DBA2 群:62697977(满)  DBA3 群:62697850(满)  

DBA 超级群:63306533(满);  DBA4 群:83829929   DBA5群: 142216823

DBA6 群:158654907    DBA7 群:172855474   DBA总群:104207940