sql優化:使用 exists 優化 in () 或 = ()

1、使用?exists 優化 in ()

優化前:

select
id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark
from BranchWarehouseApplyMaster
where stage = 0 and warehouse_id = 1
and apply_dept in (
select emp_DeptID
from Employee
where emp_ID = 'manager'
)

優化后:

select
id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark
from BranchWarehouseApplyMaster
where stage = 0 and warehouse_id = 1
and exists (
select 1
from Employee
where emp_ID = 'manager'
and emp_DeptID = apply_dept
)

2、使用?exists 優化 in ()

優化前:

select
id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark
from BranchWarehouseApplyMaster
where stage = 0 and warehouse_id = 1
and apply_dept = (
select top 1 emp_DeptID
from Employee
where emp_ID = 'manager'
)

?優化后:

select
id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark
from BranchWarehouseApplyMaster
where stage = 0 and warehouse_id = 1
and exists (
select 1
from Employee
where emp_ID = 'manager'
and emp_DeptID = apply_dept
)

3、最終優化建議

優化前:

select
id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark
from BranchWarehouseApplyMaster
where stage = 0 and warehouse_id = 1
and exists (
select 1
from Employee
where emp_ID = 'manager'
and emp_DeptID = apply_dept
)

優化說明:

  1. 索引優化(關鍵步驟):

    • 主表索引:為BranchWarehouseApplyMaster創建復合索引:

      sql

      復制

      下載

      CREATE INDEX master_idx ON BranchWarehouseApplyMaster(stage, warehouse_id, apply_dept);

      該索引直接覆蓋WHERE條件(stagewarehouse_id作為最左前綴)和連接字段apply_dept,避免全表掃描。

    • 子查詢表索引:為Employee創建覆蓋索引:

      sql

      復制

      下載

      CREATE INDEX emp_idx ON Employee(emp_ID, emp_DeptID);

      該索引直接覆蓋子查詢條件(emp_ID = 'manager')和返回字段emp_DeptID,大幅提升子查詢效率。

  2. 重寫EXISTS為IN

    • EXISTS子查詢逐行檢查,效率較低。改為IN子查詢后:

      • 子查詢先執行,結果(部門ID列表)被緩存。

      • 主表通過apply_dept IN (...) + 復合索引快速定位記錄。

    • 實際測試中,多數數據庫(如MySQL)對IN的優化優于EXISTS,尤其當子查詢結果集較小時。

  3. 執行計劃提示(可選):

    • /*+ USE_INDEX(master_idx) */?強制使用創建的復合索引,避免優化器誤選低效索引。

備選方案(JOIN寫法):

sql

復制

下載

SELECT m.id, m.order_no, m.apply_time, m.apply_dept, m.apply_operator, m.purpose, m.stage, m.remark
FROM BranchWarehouseApplyMaster m
JOIN (SELECT DISTINCT emp_DeptID FROM Employee WHERE emp_ID = 'manager'
) e ON m.apply_dept = e.emp_DeptID  -- 預過濾部門列表
WHERE m.stage = 0 AND m.warehouse_id = 1;

優點:子查詢僅執行一次,通過DISTINCT去重后連接,避免重復掃描。

優化效果:

  • 索引生效:主表通過復合索引快速過濾stage=0 + warehouse_id=1的記錄,再通過apply_dept匹配部門列表。

  • 子查詢優化Employee表通過索引直接定位manager的部門,無需全表掃描。

  • 數據流減少:IN或JOIN寫法將逐行校驗改為集合匹配,減少數據庫內部循環操作。

注意:實際執行前需在測試環境驗證執行計劃,確保索引被正確使用。如果manager對應的部門極少,IN/JOIN方案更優;如果部門較多,可考慮恢復EXISTS但確保索引有效。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86740.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP 響應狀態碼

HTTP 響應狀態碼(Response Status Codes) HTTP 響應狀態碼用于表示服務器對客戶端請求的處理結果,由3位數字 組成,分為5類: 狀態碼 類別 常見狀態碼 說明 1xx 信息響應 100(Continue) …

如何通過插件系統打造個性化效率工作流

在現代工作流中,快速調用工具與自動化操作已成為提升生產力的核心環節。一款真正出色的效率工具,不僅要在響應速度和跨平臺兼容性上表現出色,更需要具備高度的可擴展性,以滿足多樣化的使用場景。 它不僅輕量高效,還支…

Spring上下文模塊設計

經過此前我們設計的如:IoC、Web、數據訪問、AOP等模塊的設計,我們從設計上已經搭建好了Spring的基礎骨架了,但聰明的碼友會思考想到:作為一個基礎框架而言,目前應該是已經夠用了的,但是上進的碼友怎么會就此…

keil5怎么關閉工程

在project里面有一個close project,點擊后就關掉了,之前還按照其他軟件的操作習慣,右鍵工程選項,但是始終沒有發現關閉選項。

騰訊云:6月30日起,自動禁用,及時排查

大家好,我是小悟。 騰訊云發布公告,宣布從2025年6月30日開始,對長期未使用的AccessKey(API訪問密鑰)進行自動禁用。 簡單來說,如果你的密鑰在90天內沒動靜,系統就會把它關掉,不管是…

【C++】多重繼承與虛繼承

多重繼承與虛繼承 1.單繼承和多重繼承的區別2.語法規則示例代碼:多重繼承子類指定父類的構造示例代碼:多重繼承子類隱藏父類的同名方法 3.虛繼承解決多重繼承遇到的bug示例代碼:環狀繼承引發的問題 3.1 虛基類:3.2 語法規則&#…

GCC編譯/連接/優化等選項

1. GCC編譯/連接/優化等選項 1. GCC編譯/連接/優化等選項 1.1. 簡介1.2. 常用選項 1.2.1. -c -E -S -o1.2.2. -L<path> -l<library>1.2.3. -D<macro>1.2.4. -I<path> 1.3. 代碼生成和優化 1.3.1. -std<standard>1.3.2. -shared1.3.3. -fPIC1.3.…

FFmpeg 壓縮視頻文件

文章目錄 FFmpeg 壓縮視頻文件基本壓縮命令&#xff08;保持 MP4 格式&#xff09;轉換為其他格式示例&#xff1a;關鍵參數說明&#xff1a;額外優化選項&#xff1a; 在FFmpeg中使用多線程加速1. 幀級多線程 (frame-level multithreading)2. 切片級多線程 (slice-level multi…

Ubuntu 系統通過防火墻管控 Docker 容器

Ubuntu 系統通過防火墻管控 Docker 容器指南 一、基礎防火墻配置 # 啟用防火墻 sudo ufw enable# 允許 SSH 連接&#xff08;防止配置過程中斷聯&#xff09; sudo ufw allow 22/tcp二、Docker 配置調整 # 編輯 Docker 配置文件 sudo vim /etc/docker/daemon.json配置文件內…

虛擬機新增硬盤,與數據掛載

我有個虛擬機&#xff0c;當時選擇了獨立文件&#xff0c;現在遇到個問題&#xff0c;硬盤不夠了&#xff0c;索性加了一個新硬盤&#xff0c;現在想把數據庫的數據映射到這個新的硬盤處理。 羅列硬盤 lsblk我得是sdb是新硬盤 2. 分區 sudo fdisk /dev/sdb交互操作&#xff…

go語言學習 第10章:面向對象編程

第10章&#xff1a;面向對象編程 面向對象編程&#xff08;OOP&#xff09;是一種編程范式&#xff0c;它使用“對象”來表示數據和方法&#xff0c;并通過類來定義對象的結構和行為。Go語言雖然不是傳統的面向對象語言&#xff0c;但它通過結構體&#xff08;struct&#xff…

android計算器代碼

本次作業要求實現一個計算器應用的基礎框架。以下是布局文件的核心代碼&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"andr…

Go 語言接口詳解

Go 語言接口詳解 核心概念 接口定義 在 Go 語言中&#xff0c;接口是一種抽象類型&#xff0c;它定義了一組方法的集合&#xff1a; // 定義接口 type Shape interface {Area() float64Perimeter() float64 } 接口實現 Go 接口的實現是隱式的&#xff1a; // 矩形結構體…

我們來學mysql -- 8.4版本記錄慢查詢

記錄慢查詢 開啟慢查詢的配置查看慢查詢狀態動態開啟慢查詢日志永久開啟配置log_throttle_queries_not_using_indexes 記錄慢查詢對性能的影響實際案例說明第一條記錄第二條記錄第三條記錄第四條記錄 開啟慢查詢的配置 查看慢查詢狀態 - 執行 show variables like slow_quer…

2025 年中國大學生程序設計競賽全國邀請賽(鄭州)暨第七屆CCPC河南省大學生程序設計競賽(補題)

文章目錄 前言F、幻形之路G、直徑與最大獨立集H&#xff0c;樹論函數M&#xff0c; 川陀航空學院總結 前言 本次比賽&#xff0c;只能說太多沒接觸的知識了&#xff0c;還有太容易被題面嚇住。 F、幻形之路 題目鏈接&#xff1a;幻形之路 解題思路&#xff1a; 對于這一題只…

如何使用k8s安裝redis呢

在Kubernetes (k8s) 上安裝Redis 在Kubernetes上安裝Redis有幾種方法&#xff0c;下面我將介紹兩種常見的方式&#xff1a;使用StatefulSet直接部署和使用Helm chart部署。 一、安裝redis 1.1 拉去ARM鏡像&#xff08;7.4.2&#xff09; docker pull registry.cn-hangzhou.ali…

SpringBoot的5種日志輸出規范策略

在企業級應用開發中&#xff0c;合理規范的日志記錄是系統穩定運行、問題排查和性能優化的關鍵保障。 SpringBoot作為流行的Java開發框架&#xff0c;提供了強大而靈活的日志支持&#xff0c;但如何建立統一、高效的日志輸出規范卻是許多團隊面臨的挑戰。 本文將介紹SpringBo…

Python Cookbook-7.11 在 PostgreSQL 中儲存 BLOB

任務 需要將 BLOB 存入一個 PostgreSQL 數據庫。 解決方案 PostgreSQL7.2 以及更新的版本支持大對象,而psycopg 模塊提供了二進制轉義函數: import psycopg,cPickle #連接到數據庫,用你的本機來測試數據庫,并獲得游標 connection = psycopg.connect("dbname = test…

Android端口轉發

如上圖所示&#xff0c;有一個Android設備&#xff0c;Android設備里面有主板&#xff0c;主板上有網絡接口和Wi-Fi&#xff0c;網絡接口通過網線連接了一個網絡攝像頭&#xff0c;這就跟電腦一樣&#xff0c;電腦即可以通過網線接入一個網絡&#xff0c;也可以同時用Wi-Fi接入…

Unity基礎-協程

Unity基礎-協程 四、協程 概述 協程&#xff08;Coroutine&#xff09;&#xff0c;本質上并不是多線程&#xff0c;而是在當前線程中將代碼分時執行&#xff0c;不卡主線程。可以理解為&#xff0c;協程會把可能使主線程卡頓的程序分時分布進行。 協程通常用來&#xff1a;…