Not in 和 not exists

来源:https://www.cnblogs.com/newxiaobai/archive/2018/01/02/8177031.html
-Advertisement-
Play Games

本來之前以為,not exists 和之前的參數一樣的也是需要分情況來說,但是做了實驗測試之後發現。Not exists 和not in 的選擇方法十分的簡單,就是只選 not exists 因為 not in加上了不會走索引。而not exists 會走。這樣就限定了,如果要使用的話就儘可能使用n ...


本來之前以為,not exists 和之前的參數一樣的也是需要分情況來說,但是做了實驗測試之後發現。Not exists 和not in 的選擇方法十分的簡單,就是只選 not exists 因為 not in加上了不會走索引。而not exists 會走。這樣就限定了,如果要使用的話就儘可能使用not exists。
Not exists 的意思是,關聯查詢,返回除了關聯子查詢所得結果之外的值,
看如下的執行計劃和代價便可以看出來。兩者的差距。

 

SCOTT@ rac1>select * from emp where  empno not in  (select empno from t4 where  t4.deptno=20) ;

9 rows selected.

Elapsed: 00:00:01.72

Execution Plan
----------------------------------------------------------
Plan hash value: 3504968978

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    20 |  1120 |  6130   (2)| 00:00:01 |
|*  1 |  HASH JOIN ANTI NA |      |    20 |  1120 |  6130   (2)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    20 |   600 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| T4   |  1354K|    33M|  6120   (2)| 00:00:01 |
---------------------------------------------------------------------------

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

   1 - access("EMPNO"="EMPNO")
   3 - filter("T4"."DEPTNO"=20)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          1  db block gets
      43236  consistent gets
      21573  physical reads
          0  redo size
       1391  bytes sent via SQL*Net to client
        524  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          9  rows processed



SCOTT@ rac1>select * from emp where  not exists (select empno from t4 where emp.deptno=t4.deptno and t4.deptno=20) ;

9 rows selected.

Elapsed: 00:00:05.45

Execution Plan
----------------------------------------------------------
Plan hash value: 3745834269

--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |    20 |   860 |  2033  (98)| 00:00:01 |
|   1 |  NESTED LOOPS ANTI |           |    20 |   860 |  2033  (98)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP       |    20 |   600 |     3   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN | DEPTNOIND |     1 |    13 |   101  (99)| 00:00:01 |
--------------------------------------------------------------------------------

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

   3 - access("T4"."DEPTNO"=20)
       filter("EMP"."DEPTNO"="T4"."DEPTNO")

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       7754  consistent gets
       7724  physical reads
          0  redo size
       1374  bytes sent via SQL*Net to client
        524  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          9  rows processed

最後來寫個總結,之前到現在一共寫了三篇關於 exists 的文章,自覺有點繁瑣。但也是自己不斷學習的過程。很多東西還是需要自己不斷的去操作,思考。總結。言歸正傳。
exists 和 in 在兩張表差不多大小的情況下,效率,速度,是不會相差很大的。
在一大一小的情況下是存在效率上的差別的。儘管他們的執行計劃有可能是相同的。 exists 更適用於 子表大,in 適用於父表大。具體請看第二篇。
not exsits 與not in 相比,not in 之前已經看過了,並不會走相關的索引。所以,儘量使用 not exists。
另,這兩個查詢中如果有null值,會返回全部的結果集。所以註意寫語句的時候儘量避開null值。
在這裡祝大家,新年快樂吧,給自己定一個小目標。只要是工作日,每天堅持寫一篇博客。努力學習,爭取早日變成一個自己所期待的樣子!加油2018.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、安裝jdk 測試jdk是否已經安裝 [root@node002 ~]# java -version-bash: java: command not found 創建解壓目錄 [root@node002 ~]# mkdir -p /usr/local/java 上傳jdk 解壓jdk [root@ ...
  • 建庫、建表 1、建庫 (1)SQL語句命令建庫: Create database資料庫名稱 (該方法創建的資料庫沒有設置編碼亂碼) 1 2 3 4 5 -- 創建資料庫時,設置資料庫的編碼方式 -- CHARACTER SET:指定資料庫採用的字元集,utf8不能寫成utf-8 -- COLLATE ...
  • Mysql資料庫知識點 1.管理資料庫語句: 使用資料庫: use test; 添加資料庫: create database 資料庫名; create database test; 修改資料庫: alter database 資料庫名; alter database test; 刪除資料庫: dro ...
  • 今天在用一鍵安裝mysql的shell腳本安裝mysql-5.1.73軟體後發現mysql始終無法啟動,多次執行後依舊報錯,只能去查看error日誌,發現瞭如下的2個錯誤: 錯誤一:Fatal error: Can't open and lock privilege tables: Table 'm ...
  • 一、SQL數據查詢的一般格式 數據查詢是資料庫的核心操作。SQL提供了SELECT語句進行數據查詢,其一般格式為: 整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的基本表、視圖或派生表中找出滿足條件的元組,再按SELECT子句中的目標列表達式選出元組中的屬性值形成結果 ...
  • 第一節 安裝環境 1 環境說明 服 務 商 : Alibaba Cloud Elastic Compute Service 操作系統 : CENTOS 7.4 版 本 號 : Linux version 3.10.0-693.2.2.el7.x86_64 安裝日期 : 2017年10月30日 安裝人 ...
  • 今天遇到一個很奇葩的問題,也可能是自己的經驗不足。。。 搜索的時候竟然用了兩秒鐘,當然是建了索引的(非聚集索引),這個時候搜索竟然 聚集索引掃描........ 然後通過加了一個語句,提升到了19毫秒 使用的是MsSqlserver 然後在網上找了一些資料也不能找到原因。 瞭解的大神們,懂得留個言。 ...
  • 用戶對物品的評分矩陣 × 物品相似矩陣 = 推薦列表 構建物品相似度矩陣的時候可以通過計算兩個物品的餘弦相似度得出,於是需要構建每個物品在所有用戶中的評分矩陣 本例中,不採用餘弦相似度的方式計算物品與物品相似度 在MapReduce作業中,輸入數據的格式是:用戶,物品,評分 第一步、構建用於評分矩陣 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...