news 2026/6/10 13:51:37

DM数据库ENABLE_DIST_IN_SUBQUERY_OPT参数详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DM数据库ENABLE_DIST_IN_SUBQUERY_OPT参数详解

ENABLE_DIST_IN_SUBQUERY_OPT参数详解

此参数的核心功能是控制优化器是否对 IN 子查询执行“去子查询”的优化操作。

当取值为 0 时:关闭优化。SQL 语句中的 IN 子查询将保留其子查询结构,通常以 半连接 的形式在执行计划中出现。

当取值为 1 时:开启优化。优化器会尝试将符合条件的 IN 子查询移除,并将子查询内部的过滤条件提升到外层查询中,从而简化查询结构,通常能显著提升执行效率。

创建测试表

DROP TABLE T1; DROP TABLE T2; CREATE TABLE T1(C1 INT UNIQUE, C2 INT); CREATE TABLE T2(D1 INT, D2 INT);

(ENABLE_DIST_IN_SUBQUERY_OPT为0)创建测试sql

EXPLAIN SELECT /*+ ENABLE_DIST_IN_SUBQUERY_OPT(0) */ * FROM T1, T2 WHERE C1 IN (SELECT C1 FROM T1 WHERE C2<5)AND D1=C1AND D2=5; 1 #NSET2: [1, 1, 16] 2 #PRJT2: [1, 1, 16]; exp_num(4), is_atom(FALSE) 3 #INDEX JOIN SEMI JOIN2: [1, 1, 16]; join condition(T1.C2 < 5), flt_batch_exec(0) 4 #HASH2 INNER JOIN: [1, 1, 16]; RKEY_UNIQUE KEY_NUM(1); KEY(T2.D1=T1.C1) KEY_NULL_EQU(0) 5 #NEST LOOP INDEX JOIN2: [1, 1, 16] 6 #ACTRL: [1, 1, 16] 7 #SLCT2: [1, 1, 8]; T2.D2 = 5 8 #CSCN2: [1, 1, 8]; INDEX33555629(T2); btr_scan(1) 9 #BLKUP2: [1, 1, 4]; INDEX33555628(T1) 10 #SSEK2: [1, 1, 4]; scan_type(ASC), INDEX33555628(T1), scan_range[T2.D1,T2.D1], is_global(0) 11 #CSCN2: [1, 1, 8]; INDEX33555627(T1); btr_scan(1) 12 #BLKUP2: [1, 1, 4]; INDEX33555628(T1) 13 #SSEK2: [1, 1, 4]; scan_type(ASC), INDEX33555628(T1), scan_range[T1.C1,T1.C1], is_global(0)

保留了子查询结构。执行计划中出现了一个独立的 #INDEX JOIN SEMI JOIN2(索引半连接)节点,专门用于处理 IN 子查询的逻辑。。

(ENABLE_DIST_IN_SUBQUERY_OPT为1)创建测试sql

EXPLAIN SELECT /*+ ENABLE_DIST_IN_SUBQUERY_OPT(1) */ * FROM T1, T2 WHERE C1 IN (SELECT C1 FROM T1 WHERE C2<5)AND D1=C1AND D2=5; 1 #NSET2: [1, 1, 16] 2 #PRJT2: [1, 1, 16]; exp_num(4), is_atom(FALSE) 3 #SLCT2: [1, 1, 16]; (NOT(T1.C1 IS NULL) AND T1.C2 < 5) 4 #HASH2 INNER JOIN: [1, 1, 16]; RKEY_UNIQUE KEY_NUM(1); KEY(T2.D1=T1.C1) KEY_NULL_EQU(0) 5 #SLCT2: [1, 1, 16]; T1.C2 < 5 6 #NEST LOOP INDEX JOIN2: [1, 1, 16] 7 #ACTRL: [1, 1, 16] 8 #SLCT2: [1, 1, 8]; T2.D2 = 5 9 #CSCN2: [1, 1, 8]; INDEX33555629(T2); btr_scan(1) 10 #BLKUP2: [1, 1, 4]; INDEX33555628(T1) 11 #SLCT2: [1, 1, 4]; NOT(T1.C1 IS NULL) 12 #SSEK2: [1, 1, 4]; scan_type(ASC), INDEX33555628(T1), scan_range[T2.D1,T2.D1], is_global(0) 13 #CSCN2: [1, 1, 8]; INDEX33555627(T1); btr_scan(1)

消除了子查询节点。原属于子查询内部的过滤条件 T1.C2 < 5 被直接提升到了外层查询中,变成了普通的表连接与过滤操作(见计划第3行和第5行的 #SLCT2)。

TOP_ORDER_OPT_FLAG取值应用场景解析

ENABLE_DIST_IN_SUBQUERY_OPT = 1

减少计算开销:消除了 SEMI JOIN 这一额外的算子层级。半连接本身需要额外的内存和 CPU 资源来维护状态并去重,将其转换为普通的内连接和过滤可以显著降低这些开销。

更早地过滤数据:条件 T1.C2 < 5 被提取到外层后,可以在 Hash Join 发生之前(甚至在与 T2 关联时)就尽早过滤掉不符合条件的数据,减少了参与后续连接的中间结果集大小。

ENABLE_DIST_IN_SUBQUERY_OPT = 0

执行链路长:多出了 SEMI JOIN 及其相关的回表 (BLKUP2) 和索引扫描 (SSEK2) 节点,增加了 I/O 和 CPU 的消耗。

适用性局限:这种保留子查询的方式通常是在无法满足“去子查询”严格条件时的兜底策略。在当前测试场景中,由于满足优化条件却强制关闭,导致选择了次优的执行路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:51:31

AI 驱动的组件测试生成:从 DOM 快照到智能断言的工程实践

AI 驱动的组件测试生成&#xff1a;从 DOM 快照到智能断言的工程实践一、前端测试的"体力活"困境&#xff1a;为什么覆盖率始终上不去 前端项目的测试覆盖率长期低迷&#xff0c;根本原因不是工程师不重视测试&#xff0c;而是写测试太耗时。一个包含 20 个交互状态的…

作者头像 李华
网站建设 2026/6/10 13:46:22

nb666

ArkTS RelativeContainer 布局&#xff1a;零基础入门指南 一、什么是 RelativeContainer&#xff1f; RelativeContainer 是 ArkUI&#xff08;鸿蒙开发&#xff09;中用于实现相对布局的容器组件。它允许子组件通过 id 互相指定位置关系&#xff08;如 “在 A 组件的下方”“…

作者头像 李华
网站建设 2026/6/10 13:42:07

i.MX RT1170外部存储器时序配置实战:SEMC与FlexSPI深度解析

1. 项目概述与核心价值在嵌入式系统开发&#xff0c;尤其是基于i.MX RT1170这类高性能跨界处理器的项目中&#xff0c;外部存储器的访问速度和可靠性往往是决定系统整体性能的瓶颈。无论是运行在外部QSPI Flash上的代码&#xff0c;还是存储在SDRAM中的图像帧缓冲区&#xff0c…

作者头像 李华
网站建设 2026/6/10 13:38:54

Java+Vue宠物领养系统源码(含MySQL建库脚本与IDEA部署指南)

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;直接可用的宠物领养平台完整源码&#xff0c;后端用SpringBoot 2.x MyBatis-Plus Java 1.8&#xff0c;前端基于Vue 2.x ElementUI Ajax实现响应式交互&#xff1b;数据库采用MySQL 5.7&#xff0c;附带全量…

作者头像 李华
网站建设 2026/6/10 13:36:28

如何快速解决macOS Xbox手柄兼容问题:360Controller终极实用指南

如何快速解决macOS Xbox手柄兼容问题&#xff1a;360Controller终极实用指南 【免费下载链接】360Controller TattieBogle Xbox 360 Driver (with improvements) 项目地址: https://gitcode.com/gh_mirrors/36/360Controller 想在macOS上畅玩游戏的你&#xff0c;是否遇…

作者头像 李华