【问题标题】:LINQ - Speeding up query that has a join to a huge tableLINQ - 加速与大表连接的查询
【发布时间】:2013-04-15 17:45:11
【问题描述】:

我有这两张桌子

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

基本上,我想返回一个 ExpiredAccounts 列表,在结果中显示 AccountName。

我目前使用

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

这很好用。但是,这需要的时间太长。 expiredAccounts (

我是否可以加快查询速度,或者是否可以通过另一种方式来更有效地执行此操作,无论是否使用 LINQ?

【问题讨论】:

  • 这个 linq 是对象还是 ORM?如果是 ORM,您使用的查询提供程序是什么?
  • 您是否在基础表上应用了任何索引(例如,AccountID 列)?
  • @Servy 提供者是 System.Data.SqlClient @mellamokb 我不是数据库专家,但它说 PK_Account(集群)。我不知道这是否有帮助。
  • 只是出于好奇,ExpiredAccountAccount 来自哪里?它们是局部变量吗?你能展示它们是如何填充的代码吗?例如,您定义这些变量的方式可能会导致应用程序将两个表加载到内存中,并在内存中应用连接,而不是向后端发送简化的查询。
  • @mellamokb 只是常规代码优先方法:public IDbSet<Account> Accounts { get; set; } 但是,是的,就像在解决方案中一样添加相关表的 virtual 属性确实起到了作用。加载时间几乎是瞬间的。

标签: c# linq optimization query-optimization


【解决方案1】:

您可以尝试使用Contains 方法:

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

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

【讨论】:

  • 谢谢,但我已经尝试过了,我认为如果没有加入,它将无法工作。 Unable to create a constant value of type 'ExpiredAccount'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
【解决方案2】:

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

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 并在启用执行计划选项的情况下运行它,它会向您显示执行计划是什么以及需要添加哪些索引以使其更好。

【讨论】:

  • 在修改 ExpiredAccount 模型以拥有一个虚拟的 Account 属性后效果很好!加载时间发生了巨大变化。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多