【问题标题】:Linq to SQL Performance using contains使用包含的 Linq to SQL 性能
【发布时间】:2009-06-01 08:07:20
【问题描述】:

我正在重载一个查询 SQL 数据库的 vb.net 搜索过程。 我用作比较的旧方法之一使用存储过程来执行搜索并返回查询。 我的新方法使用 linq。

我有点担心使用包含 linq 查询时的性能。我正在使用这两种方法查看同等可比的查询。
基本上有1个where子句 以下是一些分析器结果;

Where name = "ber10rrt1"
  • Linq 查询:24reads
  • 存储查询:111reads

    其中名称 = "%ber10%"

  • Linq 查询:53174reads

  • 存储过程查询:23386reads

暂时忘记索引(不是我的数据库)...事实上,这两种方法基本上都在执行相同的查询(尽管存储过程确实引用了 [某些] 表的视图) .

这是否与其他人对 linq to sql 的体验一致?

另外,有趣的是;

  • 像“BER10%”这样使用

  • resultset.Where(Function(c) c.ci.Name.StartsWith(name))

在存储过程中使用 13125reads 和 linq 使用 8172reads

【问题讨论】:

  • 在哪里 name = "%ber10%" - 你的意思是喜欢吗?还有 - 有问题吗?

标签: vb.net linq performance


【解决方案1】:

我不确定那里有足够的内容进行完整的分析...我假设我们在这里谈论的是string.Contains/string.StartsWith(不是List<T>.Contains)。

如果生成的 TSQL 相似,那么结果应该具有可比性。对此有一些注意事项 - 例如,查询列是计算+持久值吗?如果是这样,SET 选项必须完全匹配才能“按原样”使用(否则必须重新计算每行)。

那么:SP 和 LINQ 中的 TSQL 是什么?它们可以直接比较吗? 您提到了VIEW - 我猜如果(例如)它过滤掉数据(通过WHEREINNER JOIN),这可能会产生很大的不同。

另外 - 以 % 开头的 LIKE 子句很少是一个好主意 - 尤其是,它不能有效地利用任何索引。使用“全文搜索”可能会获得更好的性能;但这不能通过 LINQ 直接获得,因此您必须将其包装在 SP 中并通过 LINQ 数据上下文公开 SP(只需将 SP 拖到设计器中即可)。

我的钱VIEW(和 SP 中的其他代码)是这里的主要区别。

【讨论】:

  • 我在使用 .contains() 因为用户似乎需要这个功能。 .startswith() 确实有更好的性能。该视图仅加入我在 linq 中加入的表,因此没有额外的过滤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多