日期:2014-05-17  浏览次数:20783 次

并行问题
表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不一样。