我們知道,在sql中使用in讓我們的where子句可以規定多個值。當需要從乙個集合中查詢包含某幾個值的記錄的時候,通常我們會選擇使用in來實現,其實,使用join也可以實現這樣的功能,而且效能要比in好。我會從以下幾個方面來進行總結。
使用in和join的效能對比
ef中如何使用join來代替in
首先來看一段sql語句,然後通過執行計畫來比較它們之間的效能。
使用in和join查詢的**:
下面是它們的執行計畫:
通過執行計畫,可以看到使用join的效能要比in好。
我們在使用ef的時候, 會有很多像下面這樣的查詢。
1 list productids = new list2;實際上,這種寫法生成的sql**就是使用了in,下面是使用sql server profiler監測到的結果。5using (var db = new
packagefhcontext())
6
select那麼,我們怎樣來實現join來代替in呢,我們可以借助sql clr函式來實現,**如下。…..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);
1 list productids = new list2;這裡使用了sql clr的split函式將list處理成乙個表後再關聯過濾的,生成的sql語句如下。5using (var db = new
packagefhcontext())
6
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...