并行问题
表t的分区是按列day_id的日期的每一天分区的,
(如20091201、20091202、每天一个分区,每个分区中有两百万条数据,每个月有5000万条数据),
表t在code字段上建有索引,是local索引,create index on t(code) local,
且有足够的cpu和io.
sql_1: select t.code, max(t.time) from
t
where
t.day_id between 20100101 and 20100131
group by t.code;
sql_2: select
/*+ parallel(t,4) */ t.code, max(t.time) from
t
where
t.day_id between 20100101 and 20100131
group by t.code;
问题:1,有种说法说‘涉及多个表分区的sql会自动并行’,上面的这句
sql_1为何
没并行?
2,执行sql_2时,我在pl_dev的tools-->sessions-->active sessions,看到有5个进程,
为什么
有时候用/*+ parallel(t,4) */ 放在sql中时,会有9个进程?
------解决方案--------------------问题:1,有种说法说‘涉及多个表分区的sql会自动并行’,上面的这句sql_1为何没并行?
答:alter table t parallel;
这以后,就会自动并行
------解决方案--------------------1、需要将表设计为 parallel
2、/*+ parallel(t,4) */ 用hint并行4个cup,可以在任务管理器里面可以看到有几个CPU并行运行
并行不是优化的开关
------解决方案--------------------既然是分区表,你可以按分区查询也比较快
再加上创建索引,几千万德数据查询也是比较快的
------解决方案--------------------可以在会话级默认启用并行
ALTER session enable parallel DML;
------解决方案--------------------LS的,允许并行DML对并行查询不起作用,并行查询的机制跟并行DML不一样。