2013-04-22 48 views
1

查詢我有這兩個表LINQ - 加快具有連接到一個巨大的表

ExpiredAccount     Account 
--------------     --------------- 
ExpiredAccountID     AccountID 
AccountID (fk)     AccountName 
...        ... 

基本上,我想返回顯示在結果的帳戶名ExpiredAccounts的列表。

我目前做到這一點使用

var expiredAccounts = (from x in ExpiredAccount 
         join m in Account on x.AccountID equals m.AccountID 
         select m.AccountName).ToList() 

這工作得很好。但是,這需要很長時間。 expiredAccounts中沒有很多記錄(< 200)。 另一方面的帳戶表有超過300,000條記錄。

無論如何,我可以加快我的查詢,或者另一種方式來更有效地使用或不使用LINQ?

+2

這是linq對象還是它是一個ORM?如果它是一個ORM,那麼您使用的查詢提供程序是什麼? – Servy 2013-04-22 18:00:01

+2

您是否有任何索引應用於(例如,「AccountID」列)基礎表上? – mellamokb 2013-04-22 18:00:31

+0

@Servy提供者是'System.Data.SqlClient' @mellamokb我不是一個數據庫傢伙,但它說PK_Account(集羣)。我不知道這是否有幫助。 – kei 2013-04-22 18:06:05

回答

1

首先,假設您使用的是實體框架,則根本不需要使用連接。你可以簡單地做:

var expiredAccounts = (from x in ExpiredAccount 
         select x.Account.AccountName).ToList() 

但是,我不認爲他們會在數據庫上生成不同的查詢計劃。但我的猜測是,你沒有帳戶表中的AccountID索引(儘管這似乎不太可能)。

您可以做的一件事就是使用ToTraceString(例如:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/4a17b992-05ca-4e3b-9910-0018e7cc9c8c/)來獲取正在運行的SQL。然後,您可以打開SQL Management Studio並在啓動執行計劃選項的情況下運行它,它將向您顯示執行計劃的內容以及需要添加哪些索引才能使其更好。

+0

修改」ExpiredAccount「模型以具有虛擬」Account「屬性後,此工作非常順利!加載時間急劇變化。謝謝。 – kei 2013-04-22 19:42:19

1

您可以嘗試使用Contains方法:

var expiredAccounts = (from m in Account where ExpiredAccount.Select(x => x.AccountId) 
                  .Contains(m.AccountId) 
         select m.AccountName).ToList() 

應該產生將要執行agains數據庫SQL查詢IN條款。

+0

謝謝,但我已經嘗試過這一點,我不認爲它沒有加入就可以工作。 '無法創建類型爲'ExpiredAccount'的常量值。只有原始類型('Int32,String和Guid')在此上下文中受支持。「 – kei 2013-04-22 19:33:36