簡體   English   中英

SQL內連接與子查詢

[英]SQL inner join vs subquery

我正在研究以下查詢:

Query 1: SELECT * From TabA INNER JOIN TabB on TabA.Id=TabB.Id
Query 2: SELECT * From TabA WHERE Id in (SELECT Id FROM TabB)
Query 3: SELECT TabA.* From TabA INNER JOIN TabB on TabA.Id=TabB.Id

我使用SQL Server探查器調查這些查詢,並發現了一些有趣的事實。

  • 查詢1需要2.312秒
  • 查詢2需要0.811秒
  • 查詢3需要0.944秒

塔巴 48716行

TabB 62719行

基本上我要問的是為什么查詢1需要很長時間,而不是查詢3.我已經知道'子查詢'比內連接慢,但這里查詢2最快; 為什么?

如果我不得不猜測我會說這是因為查詢1從兩個表中提取數據。 查詢2和3(aprox同時)僅為TabA提取數據。

您可以通過運行以下方法檢查此問題的一種方法:

SET STATISTICS TIME ON
SET STATISTICS IO ON

當我跑

SELECT * FROM sys.objects

我看到了以下結果。

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 104 ms.

(242 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 10, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syssingleobjrefs'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syspalnames'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 866 ms.

您可以查看每個查詢的掃描次數,邏輯讀取次數和物理讀取次數。 物理讀取當然需要更長的時間,並表示從磁盤讀取到緩存中。 如果所有讀取都是邏輯讀取,那么表格完全在緩存中。

我願意打賭,如果你看起來你會在查詢1上的TabB上看到比2和3更多的邏輯讀取。

編輯:

出於好奇,我做了一些測試並在此處寫了結果。

查詢1:
此查詢返回TabA和TabB中所有行的行,因此兩個表的覆蓋索引都要求包含每個表中的所有行。 要確切了解發生了什么,您需要查看查詢計划。

查詢2和查詢3:
您將從TabA返回所有行,並且您只需要TabB的Id列的索引。 我猜這里的區別與表統計有關,但是(再一次)我們必須看到查詢計划才能准確知道發生了什么。

這只是因為SQL不必執行JOIN。 您只是執行兩個查詢,並且只有一個查詢具有WHERE子句。

我必須承認,我並不認為這有很大的不同。

如果連接是一對多,則花費時間的可能是重復數據。 相反,您可以將一組相關行格式化為JSON數組。 檢查https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/10/09/returning-child-rows-formatted-as-json-in-sql-server-queries/上的“用例1”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM