https://www.modb.pro/db/42185
记得很多年前,在深圳软件园里给一家公司开发经营分析系统,其中一个同事从富士康出来的它自称是DBA。不过公司给他安排的是数据库开发工程师的职位,参与经营分析系统的开发工作。此时该系统已上线了半,有大量的领导在使用。他老兄使用工具查询开启了并行,没有指定并行数,立刻导致系统不能使用,尤其是领导无法连接进来查看报表数据。
并行技术应该在什么情况下使用呢?
该技术要在准备完成一件很大的工作任务时,使用常规方法需要1个小时,并且该任务可以拆分多个子任务同时进行。比如说一个10GB的全表扫描,就可以开启并行技术,把表分成5分,每个子任务扫描其中2GB大小,然后再汇总。(不要抠2GB数字)
比如 下面统计全国百家姓的收入排行版
SELECT SUBSTR(NAME,1,1),SUM(MONEY)
FROM country
group by SUBSTR(NAME,1,1)
order by 2 desc;
为了快速完成统计 要加并行提升 /*+ parallel(n)*/ 一般n为2,4,6,8 2的指数.
SELECT /*+ parallel(8)*/
SUBSTR(NAME,1,1),SUM(MONEY)
FROM country
group by SUBSTR(NAME,1,1)
order by 2 desc;
那么你会发现系统多出了8个进程,8个会话,而且执行计划都看到PX 的字眼.
那富士康的同事没有指定N值 ,这样给的提示 /*+ parallel */ 这样的提示系统最大限度使用资源,从而导致其他人无法使用系统. 这点应该写在SQL规范里,禁止选项中.
那是不是看到跑得慢的SQL都试一试?
绝非如此,不要看到一项提高SQL的技术,就认为它是个润滑油,什么地方都用的去,它有使用的场景.那就是 1 系统资源必须很充分, 2 只有少量的用户使用.
因此只有OLAP系统使用并行技术才能提高速度又没有什么风险.
当然OLTP场景下也可以,在OLTP数据维护下方可以使用. 比如建索引,CATS移动数据.
create table tmp_xxxx parallel 8 as select * from xxxx;
creae index ix_xxxx_name on xxxx(name) parallel 8;
这样会加快完成速度. 当然小心一点,那就是别完了取消并行技术. 这样的开并行会留在数据字典上的. 日后所有查询该表的SQL自然开启并行技术,所以要关掉它.
alter table tmp_xxxx noparallel; alter index ix_xxxx_name noparallel;
DML并行:
DML是数据修改 INSERT,UPDATE,DELETE下 当要更新1亿条数据的状态值时,想要尽快地下班,别加班傻等到晚上10点. 那就这样干!
alter session enable parallel dml; update country set money=money+10000; commit; alter session disable parallel dml;
为什么最后要DISABLE它呢? 因为开启DML并行后会加表锁,而且是独占型的锁.会阻止其他人修改数据.
最后您即使给了提升,当优化器不认可使用也是大有的. 因为它优化器觉得还有更好的办法.
小仙再次提醒各位 小心并且注意并行PARALLEL的使用场景:
1 系统资源必须很充分, 主要是IO资源足够空闲,又时候并且多了IO等待很慢.
2 只有少量的用户使用.这用户不仅是人,还有定时任务产生的会话, ORABBIX定时监控等.
一般系统千万别开PARALLEL ,如果是OLTP 比如报表,数据仓库,大数据,经验分析这类鬼系统,就可以放心地开!