【问题标题】:Standard SQL Query much faster than Linq 2 SQL标准 SQL 查询比 Linq 2 SQL 快得多
【发布时间】:2009-04-17 13:46:11
【问题描述】:

嘿,我的代码有问题,我比较了三种在数据库上实现查询的方法

  1. 标准 SQL 查询(从 * 选择 ...)
  2. LinQ 查询
  3. 预编译的 LinqQuery (CompiledQuery)

现在我得到的结果是 Precompiled LingQuery 比 LinQ Query 快 5 倍,但更有趣的是,Standard SQL Query 比 Precompiled LinqQuery 快大约 10 倍。我的查询运行的表是一个简单的表,与其他表没有关联。

使该表有趣的事实是它由 5 列组成,它们一起代表我的意思的主键。所有列在一起都是唯一的,因此表中没有与另一列相似的行。所有列都被索引。

有人知道 LinQ 出了什么问题吗?

致以诚挚的问候

塞巴斯蒂安

【问题讨论】:

    标签: .net sql linq


    【解决方案1】:

    您看过 linq 生成的实际查询吗?将这些与您的 SQL 查询进行比较可能会给您一些答案。

    您可以使用 SQL Profiler 或侦听 linq datacontext 的 Out 属性来执行此操作吗?您可以在控制台应用程序中这样做:

    DataContext ctx = new ...;
    ctx.Log = Console.Out;
    //Now execute the linq query, and the query will be output to the console.
    

    【讨论】:

    • 它与我从 datacontext 复制查询并将其用于 SQL 中的查询完全相同的查询
    • 奇怪...查询是不是非常非常复杂(从查询树创建查询的处理很多),但在服务器上执行速度很快?这可能会扭曲结果......
    • 是的,我认为查询很复杂,但我认为使用 CompiledQuery 可以解决问题,因为表达式树是在编译时构建的,而不是每次我再次使用查询?
    • 您是否独立测量了流程的不同部分?查询生成与数据库中的实际运行时间分开。您是否通过 SQL Profiler 运行了所有查询?
    【解决方案2】:

    只要确保您的查询没有被缓存,这可能会导致结果出现偏差。

    【讨论】:

    • 我们没有多个查询,每个查询执行一次。你是这个意思吗?
    • 我的猜测是他的意思是,如果查询首先在 Linq 中运行,那么 SQL Server 将不得不为查询创建一个执行计划。然后,当您通过 SQL Server 运行相同的查询时,计划将已被缓存,SQL 将不必花时间重新创建它。在测试之间运行以下命令:DBCC DROPCLEANBUFFERS 和 DBCC FREEPROCCACHE,或者确保每个测试运行一次,然后只为第二次运行计时。
    • 如果你一遍又一遍地查询相同的数据行,它会被缓存到内存中,因为数据来自内存而不是硬盘,因此将来查询速度会更快
    • 我在第一条评论中空间不足,但 DBCC DROPCLEANBUFFERS 应该负责数据缓存。 DBCC FREEPROCCACHE 应该负责执行计划缓存(即使对于非存储过程 - 名称有点误导)
    • 同意 Tom,在您运行每个测试之前,运行上述命令并分享您的结果。您还可以发布从 LINQ 生成的查询吗?
    【解决方案3】:

    你是如何测量的?您是使用所有查询结果,还是只执行查询? (例如,LINQ 很可能会为您获取结果。)

    您第二次执行查询时是否也会发生这种情况,或者您只是测量第一次执行所花费的时间?

    【讨论】:

    • 是的,我们正在使用我们获取的所有结果,而不仅仅是执行查询,而且它每次都会发生,我们测量所有查询的时间,而不仅仅是单个查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多