Oracle并行执行是一种分而治之的方法。执行一个sql 时,分配多个并行进程同时执行数据扫描,连接以及聚合等操作,使用更多的资源,得到更快的sql 响应时间。并行执行是充分利用硬件资源,处理大量数据时的核心技术。 在本文中,在一个简单的星型模型上,我会
Oracle并行执行是一种分而治之的方法。执行一个sql 时,分配多个并行进程同时执行数据扫描,连接以及聚合等操作,使用更多的资源,得到更快的sql 响应时间。并行执行是充分利用硬件资源,处理大量数据时的核心技术。
在本文中,在一个简单的星型模型上,我会使用大量例子和sql monitor 报告,力求以最直观简单的方式,向读者阐述并行执行的核心内容:
? Oracle 并行执行为什么使用生产者——消费者模型。
? 如何阅读并行执行计划。
? 不同的数据分发方式分别适合什么样的场景。
? 使用partition wise join 和并行执行的组合提高性能。
? 数据倾斜会对不同的分发方式带来什么影响。
? 由于生产者–‐消费者模型的限制,执行计划中可能出现阻塞点。
? 布隆过滤是如何提高并行执行性能的。
? 现实世界中,使用并行执行时最常见的问题。
术语说明:
- S: 时间单位秒。
- K: 数量单位一千。
- M: 数量单位一百万, 或者时间单位分钟。
- DoP: Degree of Parallelism, 并行执行的并行度。
- QC: 并行查询的 Query Coordinator。
- PX 进程: Parallel Execution Slaves。
- AAS: Average active session, 并行执行时平均的活动会话数。
- 分发: pq distribution method, 并行执行的分发方式, 包括 replicate, broadcast, hash 和 adaptive分发等 4 种方式, 其中 adaptive 分发是 12c 引入的的新特性, 我将在本篇文章中一一阐述。
- Hash join 的左边: 驱动表, the build side of hash join, 一本文来源gaodai#ma#com搞@@代~&码网般为小表。
- Hash join 的右边: 被驱动表, the probe side of hash join, 一般为大表。
- 布隆过滤: bloom filter, 一种内存数据结构, 用于判断一个元素是否属于一个集合。
测试环境和数据
Oracle版本为12.1.0.2.2,两个节点的RAC,硬件为ExadataX3–‐8。
这是一个典型的星型模型,事实表lineorder有3亿行记录,维度表part/customer分别包含1.2M
和1.5M行记录,3个表都没有进行分区,lineorder大小接近30GB。
selectowner seg_owner,segment_name seg_segment_name, round(bytes/1048576,2) SEG_MBfrom dba_segments whereowner = 'SID'and segment_name in ('LINEORDER','PART','CUSTOMER')/OWNER SEGMENT_NAME SEGMENT_TYPE SEG_MB------ ------------ ------------ -------- SID LINEORDER TABLE 30407.75SID CUSTOMER TABLE 168SID PART TABLE 120
本篇文章所有的测试,除非特别的说明,我关闭了12c的adaptive plan特性,参数optimizer_adaptive_features被默认设置为false。Adaptive相关的特性如cardinality feedback,adaptive distribution method,adaptive join都不会启用。如果检查执行计划的outline数据,你会发现7个优化器相关的隐含参数被设置为关闭状态。事实上,12c优化器因为引入adaptive plan特性,比以往版本复杂得多,剖析12c的优化器的各种新特性,我觉得非常具有挑战性,或许我会在另一篇文章里尝试一下。
select * from table(dbms_xplan.display_cursor('77457qc9a324k',0,’outline’));...Outline Data-------------/*+BEGIN_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('12.1.0.2')DB_VERSION('12.1.0.2')OPT_PARAM('_optimizer_use_feedback' 'false')OPT_PARAM('_px_adaptive_dist_method' 'off')OPT_PARAM('_optimizer_dsdir_usage_control' 0)OPT_PARAM('_optimizer_adaptive_plans' 'false')OPT_PARAM('_optimizer_strans_adaptive_pruning' 'false')OPT_PARAM('_optimizer_gather_feedback' 'false')OPT_PARAM('_optimizer_nlj_hj_adaptive_join' 'false')OPT_PARAM('optimizer_dynamic_sampling' 11)ALL_ROWS……END_OUTLINE_DATA*/