CBO与RBO下的IN/EXISTS

mysql之规则优化器RBO MySQL 基于规则的优化 (RBO) 是查询优化器中不可或缺的一部分。它通过快速的模式匹配和规则应用,对 SQL 查询进行初步的 “整形美容”,提升查询的可读性和执行效率。虽然 RBO 的优化能力相对有限,但它仍然是现代 MySQL 优化器的重要组成部分,与 CBO 协同工作, 共同打造高效的数据库查询引擎。参考:https://relph1119.github.io/mysql-learning-notes/#/mysql ,推荐理解本文之后去看原书,原书有一定深度需前后贯穿仔细理解。 阅读详情
    晚上抽空看了看ask tom的RSS,发现两篇应该说很入门的关于IN/EXISTS的文章:http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:953229842074,http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:442029737684
    文章很长,也没有仔细看完,不过有些东西还是很有意思的,动手实验了一下。大家随便看看咯,Tom当初回答问题的环境我已经没办法测试了,在10.1.0.4下做了些测试,CBO和RBO(使用hints)下还是很大区别的。

SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择14行。


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=14 Bytes=1218)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=1218)


SQL> create table tmp_emp as select * from scott.emp where ename like 'S%';

表已创建。

SQL> select * from tmp_emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=2 Bytes=174)
   1    0   TABLE ACCESS (FULL) OF 'TMP_EMP' (TABLE) (Cost=3 Card=2 Bytes=174)

先测试一下IN:
SQL> select * from tmp_emp where ename in (select ename from scott.emp);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=2 Bytes=188)
   1    0   HASH JOIN (SEMI) (Cost=7 Card=2 Bytes=188)
   2    1     TABLE ACCESS (FULL) OF 'TMP_EMP' (TABLE) (Cost=3 Card=2 Bytes=174)
   3    1     TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=98)

表没有做过分析,使用了HASH JOIN (SEMI)。

Tom在回答问题的时候提到:
Select * from T1 where x in ( select y from T2 )
is typically processed as:
select *
  from t1, ( select distinct y from t2 ) t2
 where t1.x = t2.y;
The subquery is evaluated, distincted, indexed (or hashed or sorted) and then
joined to the original table -- typically.
显然第二个查询是很奇怪的。也正是这个促使我打开了数据库测试,难道一个IN还需要先DISTINCT一下?没见过IN产生排序操作啊。

SQL> ed
已写入 file afiedt.buf

  1  select * from tmp_emp,(select distinct ename from scott.emp) t
  2* where tmp_emp.ename=t.ename
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO ENAME
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20 SMITH
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20 SCOTT


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=2 Bytes=188)
   1    0   VIEW (Cost=8 Card=2 Bytes=188)
   2    1     SORT (UNIQUE) (Cost=8 Card=2 Bytes=202)
   3    2       HASH JOIN (Cost=7 Card=2 Bytes=202)
   4    3         TABLE ACCESS (FULL) OF 'TMP_EMP' (TABLE) (Cost=3 Card=2 Bytes=188)
   5    3         TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=98)

显然不一样了。那么改用RULE模式:


SQL> ed
已写入 file afiedt.buf

  1  select /*+ rule */ * from tmp_emp,(select distinct ename from scott.emp) t
  2* where tmp_emp.ename=t.ename
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO ENAME
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20 SCOTT
      7369 SMITH      CLERK           7902 17-12月-80            800                    20 SMITH


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   MERGE JOIN
   2    1     VIEW
   3    2       SORT (UNIQUE)
   4    3         TABLE ACCESS (FULL) OF 'EMP' (TABLE)
   5    1     SORT (JOIN)
   6    5       TABLE ACCESS (FULL) OF 'TMP_EMP' (TABLE)

再试试加上索引:

SQL> alter table tmp_emp add constraints pk_tmpemp primary key(ename);

表已更改。

分析一下:

SQL> analyze table tmp_emp compute statistics for table for all indexed columns;

表已分析。

SQL> analyze table scott.emp compute statistics for table for all columns;

表已分析。

SQL> select *
  2  from tmp_emp e,(select distinct ename from scott.emp) t
  3  where e.ename=t.ename;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO ENAME
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20 SMITH
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20 SCOTT


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=6 Card=2 Bytes=188)
   1    0   VIEW (Cost=6 Card=2 Bytes=188)
   2    1     SORT (UNIQUE) (Cost=6 Card=2 Bytes=88)
   3    2       NESTED LOOPS (Cost=5 Card=2 Bytes=88)
   4    3         TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=70)
   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'TMP_EMP' (TABLE) (Cost=1 Card=1 Bytes=39)
   6    5           INDEX (UNIQUE SCAN) OF 'PK_TMPEMP' (INDEX (UNIQUE)) (Cost=0 Card=1)


SQL> ed
已写入 file afiedt.buf

  1  select /*+rule*/ *
  2  from tmp_emp e,(select distinct ename from scott.emp) t
  3* where e.ename=t.ename
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO ENAME
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20 SCOTT
      7369 SMITH      CLERK           7902 17-12月-80            800                    20 SMITH


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     VIEW
   3    2       SORT (UNIQUE)
   4    3         TABLE ACCESS (FULL) OF 'EMP' (TABLE)
   5    1     TABLE ACCESS (BY INDEX ROWID) OF 'TMP_EMP' (TABLE)
   6    5       INDEX (UNIQUE SCAN) OF 'PK_TMPEMP' (INDEX (UNIQUE))


SQL> select * from tmp_emp where ename in (select ename from scott.emp);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7369 SMITH      CLERK           7902 17-12月-80            800                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=1 Bytes=44)
   1    0   NESTED LOOPS (Cost=5 Card=1 Bytes=44)
   2    1     SORT (UNIQUE) (Cost=3 Card=14 Bytes=70)
   3    2       TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=70)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TMP_EMP' (TABLE) (Cost=1 Card=1 Bytes=39)
   5    4       INDEX (UNIQUE SCAN) OF 'PK_TMPEMP' (INDEX (UNIQUE)) (Cost=0 Card=1)


SQL> select /*+rule*/ * from tmp_emp where ename in (select ename from scott.emp);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7369 SMITH      CLERK           7902 17-12月-80            800                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     VIEW OF 'VW_NSO_1' (VIEW)
   3    2       SORT (UNIQUE)
   4    3         TABLE ACCESS (FULL) OF 'EMP' (TABLE)
   5    1     TABLE ACCESS (BY INDEX ROWID) OF 'TMP_EMP' (TABLE)
   6    5       INDEX (UNIQUE SCAN) OF 'PK_TMPEMP' (INDEX (UNIQUE))

这次确实接近了很多,总体上看和Tom说的情况差不多。不过RBO这种模式对后边的表对应列选择性低时应该很好,而其他情况恐怕不见得是优化的。下面看看EXISTS:

SQL> select * from tmp_emp t where exists(select null from scott.emp e where t.ename=e.ename);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7369 SMITH      CLERK           7902 17-12月-80            800                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=1 Bytes=44)
   1    0   NESTED LOOPS (Cost=5 Card=1 Bytes=44)
   2    1     SORT (UNIQUE) (Cost=3 Card=14 Bytes=70)
   3    2       TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=70)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TMP_EMP' (TABLE) (Cost=1 Card=1 Bytes=39)
   5    4       INDEX (UNIQUE SCAN) OF 'PK_TMPEMP' (INDEX (UNIQUE)) (Cost=0 Card=1)

看着和用IN一样哦。


SQL> select /*+rule*/ * from tmp_emp t where exists(select null from scott.emp e where t.ename=e.ename);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   FILTER
   2    1     TABLE ACCESS (FULL) OF 'TMP_EMP' (TABLE)
   3    1     TABLE ACCESS (FULL) OF 'EMP' (TABLE)

用RBO就不同咯!


SQL> select t.* from tmp_emp t,scott.emp e where t.ename=e.ename;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20


执行计划
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=2 Bytes=88)
   1    0   NESTED LOOPS (Cost=5 Card=2 Bytes=88)
   2    1     TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=70)
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'TMP_EMP' (TABLE) (Cost=1 Card=1 Bytes=39)
   4    3       INDEX (UNIQUE SCAN) OF 'PK_TMPEMP' (INDEX (UNIQUE)) (Cost=0 Card=1)

这样看来在CBO下,使用内关联、IN、EXISTS很可能得到同一个执行计划(更多的情况就不测试了),优化器会发现三者的语义是相同的;而在较早的RBO下EXISTS采用FILTER而IN相当于对子查询先DISTINCT后关联,内关联则是直接关联就行了。
Tom在他最新的回复中这样说:
Use the RBO and see what you see.  way back when I wrote this, that was the "more popular" of the two perhaps
today in 2005, what I said years ago using the RBO does not apply to the CBO. the cbo is smart enough to recognize these two things are effectively the same.
IN相当于对子查询先DISTINCT后关联这一条真的没有想通,RBO为什么做这样的事呢?实在是没有普适性,我个人的理解就是设计的时候认为IN后面是跟一个值列表的情况居多,当然先把值算出来,然后NL就可以了,如果后面是一个表里的值那也就一样处理;而且使用IN的时候也许大多是子查询对外层查询的筛选性高,即外层的表较大,而子查询的返回值较少。看看不同情况的不同执行计划,Oracle在CBO上确实还是花了点心思的,赫赫。

结论:在RBO下,使用IN还是EXISTS需要视情况而定,只要记住使用IN存在排序和DISTINCT这一步骤应该就不难判断;CBO下优化器会为你选择,怎么写就只是习惯问题了。
oracle 11G 实验 in 和 exists 区别 遇到一个关于优化问题,大数据量的数据  in 和 exists 的区别 特地在自己机器上实验了一把 1.数据库版本 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 2.表 SCOTT.EMP SCOTT.DEPT --SCOTT.DEPT.DEPTNO是SCOTT.EMP.DEPTNO的外键 C 阅读详情

相关推荐

VASP计算层错能(SFE)全攻略2

本文介绍了使用VASP计算纯镍(Ni)层错能(SFE)的具体步骤。首先构建Ni的FCC单胞并扩展为超胞,通过修改原子位置引入堆垛层错;随后分别计算完美晶体和含层错结构的能量;最后通过能量差与层错面积之比求得SFE值。计算需注意k点网格、截断能和超胞尺寸的收敛性测试,并推荐使用PAW赝势和ASE等工具辅助结构构建。

weixin_50519490的博客 1986

【实验】IN与EXISTS效率测试一例——CBO效率一样,RBO下EXISTS效率高于IN

1.这个实验有以下场景和实验结论:CBO没有索引的情况下:IN与EXISTS效率一样(IN:00:00:00.85 EXISTS:00:00:00.85)CBO在列上创建索引后:IN与EXISTS效率一样(IN:00:00:00...

cuanchuwei1207的博客 143

CodeBuddy 接入 MCP,一键生成网站!

2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的”桥梁”,让开发者不用再为对接问题头疼了。mcp.so如下图所示,这是 mcp.so 网站中的 MCP Server。使用百度/高德地图分析旅线计算时间接 Puppeteer 自动操作网页使用 Github/Gitlab 让大模型接管代码仓库。

悟空聊架构的专栏 1945

CBO與RBO的in和exist

SQL> select * from scott.emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12月-80 800 2

sunna0519的专栏 450

C# HttpClient 实战:3步绕过Cloudflare指纹拦截,获取完整网页内容

本文详细介绍了如何使用C# HttpClient绕过Cloudflare指纹拦截,获取完整网页内容的3步实战方案。通过完美复制浏览器请求头、智能管理Cookie容器以及处理动态挑战页面,开发者可以有效突破Cloudflare的反爬机制,适用于爬虫开发和数据采集项目。

weixin_31856057的博客 320

Dynamics 365 F&O新手必看:Visual Studio 2019搭建项目框架全流程(含Model避坑指南)

本文详细介绍了如何在Visual Studio 2019中为Dynamics 365 Finance and Operations搭建企业级项目框架,包括Model分层策略、Solution管理及开发工作流优化。特别提供了Model避坑指南和实用配置建议,帮助新手快速上手并避免常见错误。

weixin_30505225的博客 381

【实验】IN与EXISTS效率测试一例——CBO效率一样,RBO下IN效率高于EXISTS

1.创建测试表,并初始化数据(千万级别的big_table表和百万级别的big_table1表)sec@ora10g> @big_table 10000000sec@ora10g> create table...

cuanchuwei1207的博客 160

CANoe基础讲解01:从零开始使用CANoe轻松搭建你的第一个CAN网络

本文是一篇CANoe软件入门实操指南,逐步演示了如何从零创建并运行一个CAN FD仿真工程。内容包括:启动软件、配置硬件通道与网络、加载DBC数据库、使用CAPL编写仿真节点发送CAN报文,最终启动测量并在Trace窗口中查看通信结果。通过七个清晰步骤,帮助初学者快速掌握CANoe基本操作,完成首个可运行的仿真网络搭建

车载网络小D的博客 1573

RBO和CBO下的NOT IN/NOT EXISTS与外关联

SQL> analyze table scott.emp compute statistics for table for all columns;表已分析。已用时间:  00: 00: 06.06SQL> select * from scott.emp e  2  where e.empno not in (select mgr from scott.emp);未选定行已用时间:  00: 00

C'est la vie 1075

【音视频处理】MP4、FLV、HLS适用范围,在线视频播放哪个更好

本期我们讨论在线点播的视频格式,对比这些视频格式的优劣以及原因 1、封装格式的作用 2、MP4 3、FLV 4、HLS

池鱼 - YiiGaa 2万+

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1096

In和exists使用及性能分析(三):in和exists的性能分析

本节主要讨论in和exists的性能。三、in和exists的性能分析3.1 基于8i数据库使用in和exists3.1.1数据准备SQL> create table big_table as select * from ...

cuilin2183的博客 326

RT-DETR改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1646

oracle调优(2)

接上篇oracle调优(1) 11.用Where子句替换HAVING子句 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的性能开销. HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中 例如: 低效: SELECT REGION,AVG(LOG_SIZE) FROM LOCATION GROUP BY REG

Knight10zzzz的博客 218

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

sql_优化

 [03] SQL优化 1.SQL优化的实质   充分利用索引;   访问尽量少的数据块;   减少表扫描的I/O次数;   尽量避免全表扫描和其他额外开销; 2.oracle数据库常用的两种优化器   RBO(rule-based-optimizer):基于规则的优化器,根据优先级来决定执行计划.   CBO(cost-based-optimizer):基于开销

_死鬼_的博客 309

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

一文读懂 KingbaseES 查询优化器:逻辑优化(RBO)与物理优化(CBO)

你写 SQL 的时候,是不是也只盯着一件事——“我要查什么数据”?至于数据库到底怎么把这些数据翻出来,多半懒得管。说实话,我以前也这样。可后来踩的坑多了才发现,同样一句查询,有的 10 毫秒就回来了,有的能磨蹭整整 10 分钟。差距往往不在你写的 SQL 上,而在优化器替你挑的那条执行路径上。这篇文章,咱们就把查询优化器的两套看家本事——逻辑优化(RBO)和物理优化(CBO)——掰开揉碎聊聊。放心,尽量不说人话听不懂的词。

鸽芷咕的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

PostgreSQL查询优化器:CBO与RBO工作原理详解

PostgreSQL查询优化器是数据库性能调优的核心组件,它负责将SQL查询转换为最高效的执行计划。了解查询优化器的工作原理,特别是基于成本的优化器(CBO)和基于规则的优化器(RBO),对于数据库管理员和开发者来说至关重要。 ## 什么是查询优化器? 查询优化器是PostgreSQL数据库管理系统中的智能组件,它分析SQL查询语句并生成最优的执行计划。通过减少不必要的磁盘I/O和CPU计算,

gitblog_00709的博客 990

oracle where in效率,浅谈Oracle中exists与in的执行效率问题

in是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。一般大家都认为exists比in语句的效率要高,这种说法其实是不准确的,这个是要区分环境的。exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如...

weixin_34736362的博客 1529

mysql not exists not in 效率,EXISTS 和 IN ,NOT EXISTS 和 NOT IN的效率比较

在我们一般的观点中,总是认为使用EXISTS(或NOT EXISTS)通常将提高查询的效率,所以一般推荐使用exists来代替in。但实际情况是不是这个样子呢?我们用实际的例子来看一下,我们分别在两种不同的优化器模式下来看。create table test1 as select * from dba_objects ;create table test2 as select * from dba...

weixin_33260484的博客 937

浅谈Oracle中exists与in的执行效率问题

in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。一般大家都认为exists比in语句的效率要高,这种说法其实是不准确的,这个是要区分环境的。 exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条...

逆风的蔷薇 8791

听信“IN 比 EXISTS 快”,结果 SQL 慢了 10 倍?Oracle 优化避坑指南

在数据库圈子里,流传着一句“金科玉律”:\x0d\x0a“子查询结果集小用 IN,结果集大用 EXISTS。”\x0d\x0a这句话被写进了无数教程,也被一代代程序员奉为圭臬。

安呀智数据坊的博客 353

oracle in和exist的区别 not in 和not exist的区别

​​​一般大家都认为exists比in语句的效率要高,这种说法其实是不准确的,这个是要区分环境的。exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false。

dekong1010的专栏 839

【实验】IN与EXISTS效率测试一例

1.创建测试表,并初始化数据(千万级别的big_table表和百万级别的big_table1表)sec@ora10g> @big_table 10000000sec@ora10g> create ...

cuanchuwei1207的博客 107

in 和exists的用法

昨天在客户那用 in 的写法删除数据库时, 由于没有对数据进行分析,很慢要十多分钟才出来,用exists可能快点 但分析后速度就很快 in和exists 差不多 由于数据库是CBO模式 所以总结如下: 假设数据库没做分析,最好先...

cucanqi9387的博客 117
上一篇: 3月的结束·愚人节的前夕
下一篇: RBO和CBO下的NOT IN/NOT EXISTS与外关联
ern
ern
博客等级 码龄24年 25粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值