• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

【问底】陈焕生:深入理解Oracle 的并行执行

mysql 搞代码 4年前 (2022-01-09) 19次浏览 已收录 0个评论
文章目录[隐藏]

Oracle并行执行是一种分而治之的方法。执行一个sql 时,分配多个并行进程同时执行数据扫描,连接以及聚合等操作,使用更多的资源,得到更快的sql 响应时间。并行执行是充分利用硬件资源,处理大量数据时的核心技术。 在本文中,在一个简单的星型模型上,我会

Oracle并行执行是一种分而治之的方法。执行一个sql 时,分配多个并行进程同时执行数据扫描,连接以及聚合等操作,使用更多的资源,得到更快的sql 响应时间。并行执行是充分利用硬件资源,处理大量数据时的核心技术。

在本文中,在一个简单的星型模型上,我会使用大量例子和sql monitor 报告,力求以最直观简单的方式,向读者阐述并行执行的核心内容:

? Oracle 并行执行为什么使用生产者——消费者模型。
? 如何阅读并行执行计划。
? 不同的数据分发方式分别适合什么样的场景。
? 使用partition wise join 和并行执行的组合提高性能。
? 数据倾斜会对不同的分发方式带来什么影响。
? 由于生产者–‐消费者模型的限制,执行计划中可能出现阻塞点。
? 布隆过滤是如何提高并行执行性能的。
? 现实世界中,使用并行执行时最常见的问题。

术语说明:

  1. S: 时间单位秒。
  2. K: 数量单位一千。
  3. M: 数量单位一百万, 或者时间单位分钟。
  4. DoP: Degree of Parallelism, 并行执行的并行度。
  5. QC: 并行查询的 Query Coordinator。
  6. PX 进程: Parallel Execution Slaves。
  7. AAS: Average active session, 并行执行时平均的活动会话数。
  8. 分发: pq distribution method, 并行执行的分发方式, 包括 replicate, broadcast, hash 和 adaptive分发等 4 种方式, 其中 adaptive 分发是 12c 引入的的新特性, 我将在本篇文章中一一阐述。
  9. Hash join 的左边: 驱动表, the build side of hash join, 一本文来源gaodai#ma#com搞@@代~&码网般为小表。
  10. Hash join 的右边: 被驱动表, the probe side of hash join, 一般为大表。
  11. 布隆过滤: 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*/


并行初体验

串行执行


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【问底】陈焕生:深入理解Oracle 的并行执行

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址