簡體   English   中英

SQL Server中的子查詢v / s內部聯接

[英]Subquery v/s inner join in sql server

我有以下查詢

第一個使用內部聯接

SELECT item_ID,item_Code,item_Name 
FROM [Pharmacy].[tblitemHdr] I 
    INNER JOIN  EMR.tblFavourites F ON I.item_ID=F.itemID
WHERE F.doctorID = @doctorId AND F.favType = 'I'

第二個使用子查詢

SELECT item_ID,item_Code,item_Name from [Pharmacy].[tblitemHdr]
WHERE item_ID IN
(SELECT itemID FROM EMR.tblFavourites
WHERE doctorID = @doctorId AND favType = 'I'
)

在此表中, [Pharmacy].[tblitemHdr]包含15列和2000條記錄。 [Pharmacy].[tblitemHdr]包含5欄和大約100條記錄。 在這種情況下which query gives me better performance?

通常,聯接將比內部查詢更快地運行,但實際上,它將取決於SQL Server生成的執行計划。 無論您如何編寫查詢,SQL Server都將始終根據執行計划對其進行轉換。 如果它足夠“聰明”,可以從兩個查詢中生成相同的計划,那么您將獲得相同的結果。

這里這里一些幫助的鏈接。

在Sql Server Management Studio中,您可以啟用“ 客戶端統計信息 ”,還可以包括實際執行計划 這使您能夠准確知道每個請求的執行時間和負載。

還在每個請求之間清理緩存,以避免緩存對性能的副作用

USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO

我認為用肉眼看總是比依靠理論更好!

連接比子查詢快。

子查詢導致磁盤訪問繁忙,請考慮訪問硬盤時來回讀寫的針(頭?):User,SearchExpression,PageSize,DrilldownPageSize,User,SearchExpression,PageSize,DrilldownPageSize,User ...等上。

聯接通過將操作集中在前兩個表的結果上而起作用,任何后續聯接將把聯接集中在第一個聯接表的內存中(或緩存到磁盤)結果上,依此類推。 更少的讀寫針移動,從而更快

資料來源: 這里

子查詢與連接

表一20行,2列

表兩20行,2列

子查詢20 * 20

參加20 * 2

合理地糾正

詳細

在此處輸入圖片說明

在此處輸入圖片說明

掃描計數表示倍增效果,因為系統必須一次又一次地讀取數據,對於性能指標而言,只需查看時間即可

第一個查詢比第二個查詢要好..因為第一個查詢我們將兩個表都加入了。 並檢查兩個查詢的解釋計划...

這完全取決於表之間的數據和關系映射。 如果不遵循RDBMS規則,那么即使第一個查詢在執行和數據獲取上也將很慢。

暫無
暫無

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

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