oracle中使用in 和 not in 查询效率分析

news2025/1/31 6:08:00

在Oracle数据库中,INNOT IN的查询效率受多种因素影响,以下是关键点总结和优化建议:


1. IN 的效率

  • 优化方式
    • IN 通常会被优化为 OR条件半连接(Semi-Join),如果子查询关联到外部表,可能转为 EXISTS
    • 若字段有索引,且优化器选择索引扫描(Index Scan),效率较高。
  • 适用场景
    • 静态值列表较短时(例如 IN (1,2,3))。
    • 子查询结果集较小且能利用索引时。

2. NOT IN 的潜在问题

  • NULL 值陷阱
    如果子查询结果包含 NULLNOT IN 会导致结果集为空(逻辑上等价于 != ALL)。需确保子查询字段非空(如添加 WHERE col IS NOT NULL)。
  • 效率问题
    • 若子查询结果集较大,NOT IN 可能需要全表扫描,效率较低。
    • 可能被优化为 反连接(Anti-Join),但需索引支持。
  • 替代方案
    优先使用 NOT EXISTS,避免 NULL 问题且通常更高效(尤其在子查询能利用索引时)。

3. 优化建议

  • 使用 EXISTS/NOT EXISTS 替代

    -- 优于 NOT IN
    SELECT * FROM table1 t1 
    WHERE NOT EXISTS (
      SELECT 1 FROM table2 t2 WHERE t2.id = t1.id
    );
    
    • EXISTS 在找到匹配项后立即终止子查询,减少计算量。
    • NULL 安全,无需额外处理。
  • 确保索引有效

    • IN/NOT IN 涉及的字段创建索引(尤其是主键或高选择性字段)。
    • 子查询的连接字段(如 t2.id)应建立索引。
  • 处理长静态列表

    • 避免超过1000个元素的静态列表(如 IN (1,2,...,1001)),可改用临时表或拆分查询。
  • 检查执行计划
    使用 EXPLAIN PLAN 分析查询是否走索引或优化为高效的连接方式(如哈希反连接)。


4. 示例对比

场景:查询在表B中不存在的记录
  • 低效写法(可能受NULL影响):
    SELECT * FROM tableA 
    WHERE id NOT IN (SELECT id FROM tableB);
    
  • 高效改写
    SELECT * FROM tableA a 
    WHERE NOT EXISTS (
      SELECT 1 FROM tableB b WHERE b.id = a.id
    );
    

5. 关键总结

操作符效率影响因素适用场景注意事项
IN索引、子查询结果集大小、静态列表长度小结果集或静态短列表避免超长静态列表
NOT IN子查询中的NULL、索引缺失、结果集大小需显式处理NULL的子查询优先用 NOT EXISTS 替代
EXISTS子查询索引、关联字段检查存在性,尤其是大表关联NULL 安全
NOT EXISTS子查询索引、关联字段检查不存在性,替代 NOT IN优于 NOT IN 的通用选择

通过合理使用索引、避免 NULL 陷阱、改写为 EXISTS/NOT EXISTS,并结合执行计划分析,可以显著提升查询效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2286782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kaggle视频追踪NFL Health Safety - Helmet Assignment

3年前的比赛了,检测视频中的头盔,通过对比赛录像的分析,正确指派球员。每个进攻都有两个相关的视频,一个是边线视角,另一个是端区视角,而且这两个视频是同步的,即视频中的每一帧都是对应的。我用…

idea对jar包内容进行反编译

1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径,在idea的plugins下面的lib文件夹内:java-decompiler.jar。下面是我自己本地的插件路径,以作参考: D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…

deepseek R1 14b硬件要求

RTX2080ti 11G显卡,模型7b速度挺快,试试14B也不错。 7B显存使用5.6G,11B显存刚好够,出文字速度差不多。 打算自己写个移动宽带的IPTV播放器,不知道怎么下手,就先问他了。

DeepSeek-R1环境搭建推理测试

引子 这两天国货之光DeepSeek-R1火爆出圈,凑个热闹。过来看看 aha moment(顿悟时刻)的神奇,OK,我们开始吧。 一、模型介绍 1月20日,中国AI公司深度求索(DeepSeek)发布的DeepSeek-…

记录 | 基于Docker Desktop的MaxKB安装

目录 前言一、MaxKBStep 1Step2 二、运行MaxKB更新时间 前言 参考文章:如何利用智谱全模态免费模型,生成大家都喜欢的图、文、视并茂的文章! MaxKB的Github下载地址 参考视频:【2025最新MaxKB教程】10分钟学会一键部署本地私人专属…

练习(复习)

大家好,今天我们来做几道简单的选择题目来巩固一下最近学习的知识,以便我们接下来更好的学习。 这道题比较简单,我们前面学过,在Java中,一个类只能继承一个父类,但是一个父类可以有多个子类,一个…

【原创改进】SCI级改进算法,一种多策略改进Alpha进化算法(IAE)

目录 1.前言2.CEC2017指标3.效果展示4.探索开发比5.定性分析6.附件材料7.代码获取 1.前言 本期推出一期原创改进——一种多策略改进Alpha进化算法(IAE)~ 选择CEC2017测试集低维(30dim)和高维(100dim)进行测…

56. 协议及端口号

协议及端口号 在计算机网络中,协议和端口号是两个重要的概念。它们共同确保了不同计算机和网络设备之间可以正确、有效地进行通信。 协议(Protocol) 协议是网络通信的一组规则或标准,它定义了如何在计算机网络中发送、接收和解释…

短链接项目02---依赖的添加和postman测试

文章目录 1.声明2.对于依赖的引入和处理2.1原有的内容说明2.2添加公共信息2.3dependencies和management区别说明2.4添加spring-boot依赖2.5数据库的相关依赖2.6hutool工具类的依赖添加2.7测试test 的依赖添加 3.core文件的代码3.1目录层级结构3.2启动类3.3testcontroller测试类…

ADC 精度 第二部分:总的未调整误差解析

在关于ADC精度的第一篇文章中,我们阐述了模拟-数字转换器(ADC)的分辨率和精度之间的区别。现在,我们可以深入探讨影响ADC总精度的因素,这通常被称为总未调整误差(TUE)。 你是否曾好奇ADC数据表…

密码强度验证代码解析:C语言实现与细节剖析

在日常的应用开发中,密码强度验证是保障用户账户安全的重要环节。今天,我们就来深入分析一段用C语言编写的密码强度验证代码,看看它是如何实现对密码强度的多维度检测的。 代码整体结构 这段C语言代码主要实现了对输入密码的一系列规则验证&a…

Vue - pinia

Pinia 是 Vue 3 的官方状态管理库,旨在替代 Vuex,提供更简单的 API 和更好的 TypeScript 支持。Pinia 的设计遵循了组合式 API 的理念,能够很好地与 Vue 3 的功能结合使用。 Pinia 的基本概念 Store: Pinia 中的核心概念,类似于…

JxBrowser 7.41.7 版本发布啦!

JxBrowser 7.41.7 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。

亚博microros小车-原生ubuntu支持系列:17 gmapping

前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点,如果单帧激光点数大于1440,那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…

Python 变量和简单数据类型思维导图_2025-01-30

变量和简单数据类型思维导图 下载链接腾讯云盘: https://share.weiyun.com/15A8hrTs

小麦重测序-文献精读107

Whole-genome sequencing of diverse wheat accessions uncovers genetic changes during modern breeding in China and the United States 中国和美国现代育种过程中小麦不同种质的全基因组测序揭示遗传变化 大豆重测序-文献精读53_gmsw17-CSDN博客 大豆重测序二&#xff…

Django基础之ORM

一.前言 上一节简单的讲了一下orm,主要还是做个了解,这一节将和大家介绍更加细致的orm,以及他们的用法,到最后再和大家说一下cookie和session,就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…

大模型知识蒸馏技术(2)——蒸馏技术发展简史

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl2006年模型压缩研究 知识蒸馏的早期思想可以追溯到2006年,当时Geoffrey Hinton等人在模型压缩领域进行了开创性研究。尽管当时深度学习尚未像今天这样广泛普及,但Hinton的研究已经为知识迁移和模…

android获取EditText内容,TextWatcher按条件触发

android获取EditText内容,TextWatcher按条件触发 背景:解决方案:效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后&#…

毕业设计--具有车流量检测功能的智能交通灯设计

摘要: 随着21世纪机动车保有量的持续增加,城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题,本文设计了一款智能交通灯系统,利用车流量检测功能和先进的算法实现了…