Oracle rebuild index 使用 parallel 时 与 并行度 的注意事项

 

 

一.Rebuild 索引 与 并行度 说明

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

 

Oracle 索引 详解

http://blog.youkuaiyun.com/tianlesoftware/article/details/5347098

 

如何加快建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.

 

2PARALLEL  Specify PARALLEL ifyou want Oracle to select a degree of parallelism equal to the number of CPUsavailable on all participating instances times the value ofthe PARALLEL_THREADS_PER_CPU initialization parameter.

 

3PARALLEL integer Specificationof integer indicates the degree of parallelism, which is thenumber of parallel threads used in the parallel operation. Each parallel threadmay use one or two parallel execution servers. Normally Oracle calculates the optimumdegree of parallelism, so it is not necessary for you to specify 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

 

 

 

 

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

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

QQ:492913789

Email:ahdba@qq.com

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

<think>我们正在讨论Oracle表索引的并行度Parallel Degree)问题。根据用户需求,我们需要分析其优点和缺点。 首先,并行度是指在执行索引创建、重建或扫描等操作使用多个进程(或线程)同进行工作,以加快操作速度。这在处理大型表特别有用。 优点: 1. 提高性能:通过并行处理,可以显著减少创建或重建索引所需的间,特别是在多CPU系统和大数据量的情况下。 2. 充分利用系统资源:在系统资源(如CPU、I/O)空闲,可以充分利用这些资源来加速操作。 缺点: 1. 资源消耗:并行操作会消耗更多的系统资源(CPU、内存、I/O),可能会影响系统上其他操作的性能。 2. 可能引发竞争:如果系统资源已经紧张,并行操作可能导致资源竞争,从而降低整体性能。 3. 并行度设置不当可能适得其反:如果设置的并行度过高,可能会因为进程间协调开销过大而降低性能,甚至导致系统资源耗尽。 此外,在引用中提到了索引使用的一些注意事项(如避免在索引列上使用函数、避免不匹配的数据类型等),这些并行度无直接关系,但都是优化索引使用的重要方面。 关于并行度的设置,我们可以通过以下方式指定: - 在创建索引指定:`CREATE INDEX index_name ON table_name(column_name) PARALLEL degree;` - 修改现有索引的并行度:`ALTER INDEX index_name PARALLEL degree;` - 关闭并行:将degree设置为1,或者使用`NOPARALLEL`。 注意:并行度(degree)指的是并行操作使用的进程数。通常可以设置为CPU核数的整数倍,但需要根据实际系统负载和资源情况调整。 生成相关问题: 1. 如何确定Oracle索引的合适并行度? 2. 在哪些情况下应该避免使用并行度? 3. 并行度对索引维护操作(如重建)有什么影响?</think>### Oracle表索引并行度的优点和缺点分析 #### 优点 1. **加速索引操作** 通过并行处理(如`PARALLEL`指令),索引创建、重建等操作可同使用多个进程/线程,显著减少大型表的索引维护间。例如: ```sql CREATE INDEX idx_name ON table_name(column) PARALLEL 8; -- 使用8个并行进程 ``` 2. **提升查询性能** 对包含并行索引的复杂查询(如全表扫描),Oracle可自动分配并行执行服务器,充分利用多核CPU资源加速查询[^1]。 3. **资源利用率优化** 在系统资源空闲(如夜间批处理),高并行度可快速完成索引维护任务,避免长间占用资源。 #### 缺点 1. **资源争用风险** 高并行度会大幅增加CPU、内存和I/O消耗,可能导致系统资源枯竭,影响其他业务操作[^2]。 *示例问题场景*: ```sql ALTER INDEX idx_name REBUILD PARALLEL 32; -- 过高的并行度可能引发系统负载激增 ``` 2. **并行度设置不当的副作用** - **过度并行**:协调多个进程的开销可能超过并行收益,反而降低性能。 - **索引分裂延迟**:并行插入操作可能导致索引块竞争,增加分裂延迟(如B-Tree索引)。 3. **维护复杂性增加** - 需持续监控系统负载调整并行度,避免影响在线业务。 - 并行操作可能产生大量临段,占用额外存储空间。 #### 使用建议 1. **场景化配置** - 大型数据仓库:可设置较高并行度(如`PARALLEL 16`)。 - OLTP系统:建议默认`NOPARALLEL`,仅在维护窗口启用有限并行。 2. **动态调整策略** ```sql ALTER SESSION FORCE PARALLEL DDL PARALLEL 4; -- 会话级控制 ALTER INDEX idx_name NOPARALLEL; -- 禁用并行 ``` 3. **结合其他优化** 避免易失效操作(如索引列计算、`LIKE '%abc'`)同使用,防止并行优势被抵消[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值