- 论坛徽章:
- 0
|
另外,oracle是可以并行执行的,找到oracle的并行查询文档看了看
地址在这:
http://download.oracle.com/docs/ ... a96524/c20paral.htm
因为之前的疑问,更关于刚才关注的两个方面意义和条件总结一下:
一、意义:
很多在线事物处理(OLTP)相对来说需要很快的相应速度,在几秒几毫秒之间就需要完成的操作是不适合并行执行的,因为执行并行操作的开销将比单个执行来的大。但是在非时间紧迫的情况下,并行执行可以有效的处理大量的批量操作。比如一个银行能使用并行批处理程序来执行上百万条数据的升级请求。还有在决策支持系统(Decision Support Systems,简称DSS)中,复杂的查询,比如涉及join的操作或者搜索非常大的表都能从并行执行中获益。
并行执行提高了以下几种操作的性能:
1.查询;
2.创建大的索引;
3.大量记录的插入,更新和删除;
4.聚合与复制;
二、并行执行所需要的四个条件:
1.对称多处理器(SMP),集群,或者大规模的并行系统;
2.充足的I/O带宽;
3.利用不足或间歇使用的处理器(例如,系统中,CPU的使用通常小于30%);
4.足够的内存来支持额外的内存密集型处理如排序,hash和I/O缓存;
三、来看看实现时的一些基本概念:
一条执行语句如:SELECT * FROM employees ORDER BY employee_name;将被解析后生成有两个操作(scan 和 sort)的执行计划,那么这两个操作是并发执行的,每个操作又被多个并行执行服务(parallel execution servers)并行的执行(比如,排序操作中名字范围为A-G,H-M,N-S,T-Z分别由四个并行执行服务来并行执行排序)。而在oracle中最多有两个操作可以并发的执行的,如果有第三个操作比如还有一个ORDER BY在之前ORDER BY empleoyee_name之后,那么需要扫描操作(scan)结束之后然后这个操作的并行执行服务转去执行这第三个ORDER BY.
操作的数据来源是这样的:
表/索引被协调器动态分割成不同的负载单元(granules),每个并行执行服务执行一个granule,granule和并行执行服务间的映射不是静态的而是执行时决定的.每个granule是表的物理块的一小部分.当一个并行执行服务执行完一个granule,他就去看协调器里是否还有未执行的granule,如果就就执行,知道所有granule被执行完,也就是说整张表都读完了,协调器把所有从执行服务返回的结果进行整合.
流程:
协调器 --> 表/索引 --> |-- granule-->|-- 操作1 |-- 并行执行服务1
|-- granule-->| (scan) |-- 并行执行服务2
|-- granule-->| ……
…… | ||
| ∨
|-- 操作2 |-- 并行执行服务1
| (sort) |-- 并行执行服务2
……
---------------
总结可能不是很准确,也不清楚我的理解对不对,大家可以根据需要看看原文。
额,这么看来并行还是有那么点意义的(幸好啊幸好 =。=:)
但多核优化的可行性还是有些疑问啊:
1.条件里有个SMP,那SMP是共享内存的么,如果是的话,那I/O带宽岂不是又不充足了?
2.既然内存的I/O这么重要,我想知道MySQL在内存里都放了些什么东西呢?
(这有篇oracle的内存:http://download.oracle.com/docs/ ... /c08memor.htm#10127)
3.如果确实可以把一个操作分割来执行,比如在排序中就有AlphaSort algorithm的并行排序算法,那么如果MySQL按oracle这样来并行执行的话,主要会遇到哪些问题呢?请教ing~~~
[ 本帖最后由 liova 于 2009-11-25 17:00 编辑 ] |
|