LINQ - 加速具有连接到巨大表的查询

时间:2013-04-22 17:58:02

标签: c# linq optimization query-optimization

我有这两个表

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

基本上,我想返回结果中显示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 个答案:

答案 0 :(得分:1)

您可以尝试使用Contains方法:

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

它应该在SQL查询中生成IN子句,该子句将再次执行数据库。

答案 1 :(得分:1)

首先,假设您正在使用实体框架,则根本不需要使用连接。你可以这样做:

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

但是,我认为他们不会在数据库上生成不同的查询计划。但我的猜测是你在Account表中没有AccountID的索引(虽然这似乎不太可能)。

您可以做的一件事是使用ToTraceString(例如:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/4a17b992-05ca-4e3b-9910-0018e7cc9c8c/)来获取正在运行的SQL。然后,您可以打开SQL Management Studio并在启用执行计划选项的情况下运行它,它将显示执行计划是什么以及需要添加哪些索引才能使其更好。