【问题标题】:Where() performance issues with a high number of returned rows大量返回行的 Where() 性能问题
【发布时间】:2019-07-09 02:56:56
【问题描述】:

我有一个 SQL Server 数据库表,其中包含大约 300 万条记录。我有一个 MVC 站点,其中有一个页面可以显示该表中的数据,但我遇到了广泛的性能问题。

像这样运行一个简单的查询大约需要 25-30 秒才能返回大约 2000 行:

_dbContext.Contracts
    .Where(c => c.VendorID == vendorId)
    .ToList();

我认为可能正在生成的 sql 正在做一些奇怪的事情,但这很简单:

SELECT 
    [Extent1].[ContractID] AS [ContractID], 
    [Extent1].[VendorID] AS [VendorID], 
    [Extent1].[Amount] AS [Amount], 
FROM [dbo].[Contracts] AS [Extent1]
WHERE [Extent1].[VendorID] = @p__linq__0

但不同的是,当我直接在数据库上运行这个查询时,只需要 3-5 秒。所以我觉得 EF 可能在做一些奇怪的事情。

有什么办法可以提高它的性能吗?在 SQL 端还是在我的 EF 解决方案中?

网站有点旧,它是 MVC 3 和 EF 4

【问题讨论】:

  • 这是一个新的 DbContext 实例吗?如果您有长期存在的 DbContext 实例,则更改跟踪器将累积大量对象实例,这会减慢对象实现速度。
  • @DavidBrowne-Microsoft 这是一个新实例
  • 您是如何配置延迟加载的?也许 EF 也在尝试引入相关对象。

标签: c# asp.net sql-server performance entity-framework


【解决方案1】:

在 SQL 端,您应该在 Contracts 表的 VendorID 列上创建一个非聚集索引。

【讨论】:

  • 那么在没有linq的情况下运行查询时缺少索引不影响?
  • @TheVillageIdiot - 索引在这两种情况下都很重要。不同之处可能在于数据的缓存。每个计时测试运行两次。
【解决方案2】:

看起来像是代码方面的问题(不是 SQL 方面的问题)。 您是否在“合同”类构造函数中添加了一些内容?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2011-03-10
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多