【问题标题】:Linking records on foreign slow in LINQ query在 LINQ 查询中链接外国慢速记录
【发布时间】:2011-11-02 16:25:49
【问题描述】:

在链接外键上的记录时,我的查询执行速度极慢。例如,我有一个包含 DateTime/double 对的“GraphPoint”类。此查询在一秒钟内执行 150000 条记录(值的虚拟数字):

var data = from x in dataContext.Table1
           select(new GraphPoint(x.Time, 100));

List<GraphPoint> graphPoints = new List<GraphPoint>(data);

当我尝试在外键上链接第二个表时,执行速度会变慢。一个小时后我放弃了这个查询:

var data = from x in dataContext.Table1
           select(new GraphPoint(x.Time, x.Table2.First().Value));

List<GraphPoint> graphPoints = new List<GraphPoint>(data);

为什么比第一个慢?

我尝试过使用预编译查询,但这也无济于事。

【问题讨论】:

  • 是实体框架还是 LINQ to SQL?您的问题中有两个标签。

标签: .net performance entity-framework linq-to-sql c#-4.0


【解决方案1】:

使用DataContext.Log 属性查看正在生成的确切 SQL,然后调查是否可以在数据库端执行任何操作来优化查询性能(例如添加索引)。

【讨论】:

  • 我正在为这个特定的查询使用 SDF 数据库,但我不知道如何为非主键的列建立索引。
  • @BoroDrummer 在服务器资源管理器中,展开代表您的表的节点,右键单击 Indexes 子节点并选择 Create Index
  • 成功了!现在查询时间减少到大约 20 秒。看起来仍然相当慢,但它几乎可以接受。谢谢。
【解决方案2】:

使用 table1 加载第二个表可能会提高性能,

试试

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Table1>(x => x.Table2);
dataContext.LoadOptions = dlo;

Linq 正在将其转换为动态 sql 并动态获取 table1 中相关表记录的每条记录,这会降低性能。

【讨论】:

  • 我假设这个代码块应该在查询之前是正确的吗?如果是这样,我的查询仍然需要 10 多分钟(在那之后我中止了它)。
  • 那么可能是sql db的情况,您的主键和外键是否正确索引?!
  • 外键不是。明天我会尝试弄清楚如何做到这一点。谢谢!
  • 向外键添加索引使一切变得不同。但是,用 table1 加载第二个表并没有改善。不过感谢您的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
相关资源
最近更新 更多