使用Join代替In

2021-09-06 21:37:42 字數 1477 閱讀 1775

我們知道,在sql中使用in讓我們的where子句可以規定多個值。當需要從乙個集合中查詢包含某幾個值的記錄的時候,通常我們會選擇使用in來實現,其實,使用join也可以實現這樣的功能,而且效能要比in好。我會從以下幾個方面來進行總結。

使用in和join的效能對比

ef中如何使用join來代替in

首先來看一段sql語句,然後通過執行計畫來比較它們之間的效能。

使用in和join查詢的**:

下面是它們的執行計畫:

通過執行計畫,可以看到使用join的效能要比in好。

我們在使用ef的時候, 會有很多像下面這樣的查詢。

1 list productids = new list2;

5using (var db = new

packagefhcontext())

6

實際上,這種寫法生成的sql**就是使用了in,下面是使用sql server profiler監測到的結果。

select

…..from

[dbo

].[pkg_productmaster]as

[extent1

]where

[extent1

].[productid

]in (15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30);

那麼,我們怎樣來實現join來代替in呢,我們可以借助sql clr函式來實現,**如下。

1 list productids = new list2;

5using (var db = new

packagefhcontext())

6

這裡使用了sql clr的split函式將list處理成乙個表後再關聯過濾的,生成的sql語句如下。

select

……from

[dbo

].[pkg_productmaster]as

[extent1

]inner

join

[dbo

].[clr_split

](@input, @delimiter, @isremoveemptyentries) as

[extent2]on

cast( [

extent1

].[productid]as

nvarchar(max)) =

[extent2

].[id

]where58=

[extent1

].[departurecityid

];

使用exists代替in

select from class a where id in select id from class b select from class a a where exists select from class b b where a.id b.id 分析 上述兩種方法查詢結果一樣,但exist...

使用ThreadPool代替Thread

執行緒的空間開銷 執行緒核心物件。包含上下文資訊。32位系統占用700位元組 執行緒環境塊。包括執行緒的異常處理鏈。32位系統占用4kb 使用者模式棧。儲存方法的引數 區域性變數和返回值 核心模式棧。呼叫作業系統的核心模式函式時,系統會將函式引數從使用者模式棧複製到核心模式棧。32位系統占用12kb...

使用註解代替xml

1 導包 4 2 spring aop 2 為主配置檔案引入新的命名空間 約束 在catalog中匯入約束 為主配置檔案匯入context約束 3 書寫主配置檔案 4 在類中使用註解 service user controller user repository user component use...