首页 > 数据库 >Oracle反连接HASH JOIN ANTI NA会处理驱动表连接列null值

Oracle反连接HASH JOIN ANTI NA会处理驱动表连接列null值

时间:2023-06-14 16:55:23浏览次数:64  
标签:00 HASH NA col COL JOIN null 连接

 

Oracle反连接HASH JOIN ANTI NA会处理驱动表连接列null值

 

这个现象和Oracle内连接HASH JOIN/半连接HASH JOIN SEMI不处理驱动表连接列null值相反。

反连接中无论一下哪个结论都一样:

  • HASH JOIN ANTI NA
  • HASH JOIN ANTI SNA
  • HASH JOIN RIGHT ANTI NA
  • HASH JOIN RIGHT ANTI SNA

测试表t,tt的信息如下:其中t表全是null值。

15:16:18 ZKM@zkm(37)> desc t                                        15:16:20 ZKM@zkm(37)> desc tt 
 Name    Null?    Type                                               Name    Null?    Type
 ------- -------- -------------                                      ------- -------- -------------
 COL              VARCHAR2(20)                                       COL              VARCHAR2(20)


15:17:40 ZKM@zkm(37)> select col,count(*) from t group by col;       15:17:43 ZKM@zkm(37)> select col,count(*) from tt group by col;
                                                                     
COL      COUNT(*)                                                    COL      COUNT(*)
------ ----------                                                    ------ ----------
          1000000                                                                    1
                                                                     a               1
Elapsed: 00:00:00.16                                                 
                                                                     Elapsed: 00:00:00.00

 

 现有sql和执行情况如下:

其中,id=2花费的时间达到25s(33-7-1),如果是Oracle内连接HASH JOIN/半连接HASH JOIN SEMI不处理驱动表连接列null值中,会忽略null值导致秒出。

select /*+ leading(t) */ count(*) from t where t.col not in (select tt.col from tt);
Plan hash value: 1065647028

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      1 |00:00:00.33 |    1578 |       |       |          |
|   1 |  SORT AGGREGATE     |      |      1 |      1 |      1 |00:00:00.33 |    1578 |       |       |          |
|*  2 |   HASH JOIN ANTI NA |      |      1 |    201M|      0 |00:00:00.33 |    1578 |    37M|  7549K|   58M (0)|
|   3 |    TABLE ACCESS FULL| T    |      1 |    201M|   1000K|00:00:00.07 |    1574 |       |       |          |
|   4 |    TABLE ACCESS FULL| TT   |      1 |      2 |      1 |00:00:00.01 |       4 |       |       |          |
-----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T"."COL"="TT"."COL")

 

创建索引,还是一样。

create index idx_col on t(col);

 

insert多15000000多行null值数据,如下:

16:43:47 ZKM@zkm(37)> select col,count(*) from t group by col;

COL                                                            COUNT(*)
------------------------------------------------------------ ----------
                                                               16000000

Elapsed: 00:00:02.62

 

 

再次执行sql语句:防偷

时间和消耗大大增加,说明在反连接的情况下,hash join无法忽略null值,还是会对null进行hash值计算,其实这很不合理。

select /*+ leading(t) */ count(*) from t where t.col not in (select tt.col from tt);
Plan hash value: 1065647028

---------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  | Writes |  OMem |  1Mem | Used-Mem | Used-Tmp|
---------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      1 |00:00:06.05 |   24392 |  14229 |  14229 |       |       |          |         |
|   1 |  SORT AGGREGATE     |      |      1 |      1 |      1 |00:00:06.05 |   24392 |  14229 |  14229 |       |       |          |         |
|*  2 |   HASH JOIN ANTI NA |      |      1 |    201M|      0 |00:00:06.05 |   24392 |  14229 |  14229 |   542M|    29M|  892M (0)|     115K|
|   3 |    TABLE ACCESS FULL| T    |      1 |    201M|     16M|00:00:01.18 |   24388 |      0 |      0 |       |       |          |         |
|   4 |    TABLE ACCESS FULL| TT   |      1 |      2 |      1 |00:00:00.01 |       4 |      0 |      0 |       |       |          |         |
---------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T"."COL"="TT"."COL")

 

标签:00,HASH,NA,col,COL,JOIN,null,连接
From: https://www.cnblogs.com/PiscesCanon/p/17480749.html

相关文章

  • [nodejs] __dirname is not defined in ES module scope
    原因:CommonJS中提供的全局变量如require, exports, module.exports, __filename, __dirname等,在ESModules环境中均是不可用的,require, exports, module.exports在ESModules中基本对应着import,export,exportdefault。解决:import{dirname}from"node:path......
  • 通过使用动态ip解决网络连接问题
     互联网的使用已经成为我们生活中不可或缺的一种生活方式。但是,有时候我们会遇到网络连接问题,如IP地址冲突、网络瘫痪等等。这种情况往往会影响我们的工作,现在我们一般使用动态ip地址来解决这些问题。  一、什么是动态ip地址  动态IP地址是由互联网服务提供商临时分配给......
  • Socks5代理:加速网络连接与保障隐私的全方位解决方案
    在全球范围内,用户面临着各种互联网限制、地理区域限制和网络安全威胁。Socks5代理服务通过在用户和目标服务器之间建立中间层,为用户提供了一个更加安全和高效的通信渠道。它可以应用于多种场景,包括访问受限网站、提高网络速度和匿名浏览等。同时,Socks5代理还具备多种功能和协议支持......
  • OpenAI发布ChatGPT函数调用和API更新
    2023年6月13日,OpenAI针对开发者调用的API做了重大更新,包括更易操控的API模型、函数调用功能、更长的上下文和更低的价格。在今年早些时候发布gpt-3.5-turbo,gpt-4在短短几个月内,已经看到开发人员在这些模型之上构建了令人难以置信的应用程序。今天,我们将跟进一些令人兴奋的更新:Cha......
  • An analysis of what are the drug targets for the treatment of systemic lupus ery
    Systemiclupuserythematosus(SLE)isanautoimmunediseasethatproduceslargeamountsofimmunecomplexesandautoantibodiesandcausesdamagetothekidneys,skin,joints,andcentralnervoussystem.CurrentSLEtreatmentismostlyglucocorticoid-ledd......
  • 本地电脑连接远程服务器上的SQLServer配置
    1.首先是要打开SQLServer2016配置管理器 2.SQLServer网络配置的MSSQLSERVER的协议和配置相关的客户端协议,开启TCP/IP 3.数据库默认的远程端口是1433,但是不是安全的,可以手动更改端口,更待客户端协议的IP,本实例用1433端口  这里需要找到最下边的IPAll,然后修改......
  • OpenAI发布ChatGPT函数调用和API更新
    2023年6月13日,OpenAI针对开发者调用的API做了重大更新,包括更易操控的API模型、函数调用功能、更长的上下文和更低的价格。在今年早些时候发布gpt-3.5-turbo,gpt-4在短短几个月内,已经看到开发人员在这些模型之上构建了令人难以置信的应用程序。今天,我们将跟进一些令人兴奋的更新:......
  • Windows Terminal 中配置代理
    WindowsTerminal中配置代理cmd中临时设置代理:sethttp_proxy=http://127.0.0.1:10809sethttps_proxy=http://127.0.0.1:10809取消代理:sethttp_proxy=sethttps_proxy=‍若要长久生效,在系统环境变量中添加:http_proxy和https_proxy两个系统变量,值均为:http://127.......
  • 搭建promtetheus+grafana性能监控环境
    环境准备CentOSLinuxrelease7.7.1908(Core)prometheus-2.36.2grafana-enterprise-9.0.2-1node_exporter-1.3.1mysqld_exporter-0.14.0备注:软件可以去清华镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/github-release/prometheus/prometheus/或者:https://download......
  • 【230614-1】已知在三角形ABC中,有A+B=3C,且2Sin(A-C)=SinB 求:(1)SinA (2)AB=5,求AB上
    【题目】已知在三角形ABC中,有A+B=3C,且2Sin(A-C)=SinB 求:(1)SinA (2)AB=5,求AB上的高?(23年高考数学新一卷17题)......