ora_parallel自我笔记

文章详细介绍了如何在Oracle数据库中查看并行度、关闭并行操作,以及如何选择合适的并行度。并行度一般推荐使用2的幂,如2、4、8等,特殊情况可更高。创建大表和索引时可以设置并行度,DML操作如INSERT、DELETE、UPDATE、MERGE也可启用并行,但需注意并行带来的并发控制和资源消耗问题。并行度的选择应考虑返回数据量和表的过滤效果。

并行

查看并行度:

select table_name ,degree from dba_tables where table_name = '';

#———————————————————————————

关闭并行:

alter table xx.xx noparallel;

alter index xx.xx noparallel;

#———————————————————————————

并行度的选择

一般使用2的幂作为并行度,如2、4、8、16等,正常情况并行度不要设置太高,建议最多不要超过32。

特殊情况特殊对待,强悍的系统(比如exadata),

如果需要非常高的响应速度,并行度再多个几倍也不是问题。并行高的时候并发就要减少,否则可能会耗光并行资源。

#———————————————————————————#

使用例:

创建大表

create table test parallel 16 as select .... from t1,t2 where .....;

alter table test noparallel;

#———————————————————————————

创建或重建索引

create index idx_test on table_A(name) parallel 8;

alter index idx_test noparallel;

#———————————————————————————

表分析degree=>6

exec dbms_stats.gather_table_stats('RES_ANHUI','ADDR_SEGM',method_opt=>'for all indexed columns size 254',granularity=>'ALL',cascade=>TRUE);

exec dbms_stats.gather_table_stats('RES_ANHUI','ADDR_SEGM',partname=>'SYS_P101',estimate_percent=>1,no_invalidate=>FALSE,degree=>6,granularity=>'PARTITION',cascade=>true);

exec dbms_stats.gather_table_stats('RES_ANHUI','ADDR_SEGM',partname=>'SYS_P102',estimate_percent=>1,no_invalidate=>FALSE,degree=>6,granularity=>'PARTITION',cascade=>true);

exec dbms_stats.gather_table_stats('RES_ANHUI','ADDR_SEGM',partname=>'SYS_P103',estimate_percent=>1,no_invalidate=>FALSE,degree=>6,granularity=>'PARTITION',cascade=>true);

exec dbms_stats.gather_table_stats('RES_ANHUI','ADDR_SEGM',partname=>'SYS_P104',estimate_percent=>1,no_invalidate=>FALSE,degree=>6,granularity=>'PARTITION',cascade=>true);

#———————————————————————————#

并行hint的写法

/*+ parallel(n) */

#———————————————————————————

只要在整个sql的任何一个关键字

(select、update、insert、delete、merge)

后面出现一次

parallel(n)

那么整个SQL相关的表,都会使用并行

select /*+ parallel(8) */…from t1,t2…

#———————————————————————————

对指定的表开并行

select /*+ parallel(a 4) parallel(b 4) */ … from t1,t2…

例如对t1表开并行

select /*+ parallel(t1 8) */count(*) from demo t1,test t2 where t1.object_id = t2.object_id;

#———————————————————————————

索引:(括号内可以是空格也可以是逗号)

select /*+ parallel_index(demo idx_id_demo 8) */object_id from demo where object_id > 1000;

#———————————————————————————#

DML并行:

INSERT、DELETE、UPDATE还有MERGE

#———————————————————————————

这种只会在后面select开并行,dml是默认不开并行的

insert /*+ parallel(4) */ into t1 select .... from ....;

#———————————————————————————

所以:必须在session级别通过下面命令开启

alter session enable parallel dml;

活着用force的语法,可以使下面的dml即使不用parallel的hint,也会使用并行度为n的并行。

alter session force parallel dml parallel n;

开启了DML的并行后,接下来的DML语句将会产生一个表锁,

在commit之前,

当前session 不能对该表做查询和dml操作,其他session也不能对该表做DML操作。

#———————————————————————————

所以:流程应为:

alter session enable parallel dml;

your dml;

commit;

alter session disable parallel dml;

或者

alter session force parallel dml parallel 1;

#———————————————————————————#

备注:

对于提到的表的情况,并不是指这个表内具体有多少数据,

比如一个表有1 亿行记录,返回一行数据,那么肯定是不能用并行的,效率最高的肯定是索引;

一个表只有100 万行,但是返回了20 万行记录,那么用索引肯定效率低,可以考虑并行;

总的来说,表的分析是指经过where 条件过滤后返回的记录,

如果返回的数据很少,哪怕表的数据量很大,那么都适合使用索引,

如果表的记录数相对不大,返回的记录数多,那么可以考虑使用并行的全表扫描。

### 解决 Oracle 错误 ORA-01113 和 ORA-01110 当遇到 `ORA-01113` 和 `ORA-01110` 错误时,通常意味着数据文件需要介质恢复才能继续操作。以下是详细的解决方法: #### 关闭并重启数据库实例 为了确保数据库处于一致状态,在执行任何修复之前应先正常关闭再启动数据库实例。 ```sql shutdown immediate; startup; ``` 如果此时仍然收到 `ORA-01113` 和 `ORA-01110` 错误提示,则表明指定的数据文件确实存在问题[^4]。 #### 执行介质恢复 针对受影响的数据文件进行特定的介质恢复工作是必要的步骤之一。通过以下命令可完成这一过程: ```sql recover datafile 'G:\ORACLE\PRODUCT\10.2.0\ORADATA\MYDB\SYSTEM01.DBF'; ``` 此命令会尝试应用所有可用的日志记录直到达到一致性点为止[^5]。 #### 重新打开数据库 一旦成功完成了上述恢复流程之后,就可以再次尝试开启数据库了: ```sql alter database open; ``` 假如一切顺利的话,现在应该能够正常使用该数据库而不会再碰到之前的错误消息了。 另外值得注意的是,某些情况下可能还需要进一步的操作比如使用 `resetlogs` 参数来重置日志序列号以匹配新的SCN (System Change Number),这取决于具体的环境配置以及所使用的Oracle版本等因素影响[^3]。 对于频繁遭遇这类问题的情况,考虑部署专门的一键恢复工具可能会是一个不错的选择,它能简化日常维护工作中涉及到的各种复杂场景下的快速响应机制[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值