【问题标题】:Query optimization challenge - Is it possible to tweak this linq query查询优化挑战 - 是否可以调整此 linq 查询
【发布时间】:2012-10-10 19:18:48
【问题描述】:

我正在参加一项性能练习,我想知道是否有机会改进这一点,只是通过查询此信息的方式,而不是尝试进行任何数据库架构或数据更改。

以下查询大约需要 200 毫秒才能执行。我知道我雄心勃勃,但挑战在于是否有办法让自己失望。我准备使用 ADO.NET 或使用 SP 或使用 sql 查询,但不能进行任何数据更改。此外,EmpTable 有大约 2000 万行。 它选择与参数匹配的 1 条记录。

有人认为这仍然可以进一步优化吗?

Log.Time()
            using (MyDataContext db = MyDataContext.GetContext())
            {
                db.ObjectTrackingEnabled = false;
                var _Query = from t in db.EmpTable
                             where t.id == paramId
                             select t;

                 if (!_Query.Any())
                    return null;
            }
            Log.Time()  -- 200 ms approx

【问题讨论】:

  • 您是否已经分析了查询?代码没有太大变化,因此您必须考虑在表格上添加适当的索引。
  • 一次将数据加载到哈希表中,然后在内存中搜索paramId。我不认为你可以减少查询执行时间。
  • 如果性能是一个很大的问题,我会避免使用 linq,因为它生成的 sql 有时会被混淆。
  • @48klocs 索引已经存在,我们将 paramId 与主键进行比较。
  • 对其进行分析。实际查询需要多长时间才能返回?如果它在不到 200 毫秒内返回,您可能会看到 precompiling the query 是否有帮助(不确定它是否适用于这么简单的事情)

标签: c# sql performance linq query-optimization


【解决方案1】:

您的查询看起来很简单,您将无法对其进行太多改进。

我要检查的第一个地方是,看看您是否可以在针对此查询优化的表上添加索引以提高性能。

为您正在运行的查询获取查询执行计划并查找任何问题区域。这似乎是一个可以通过数据库调整得到最好解决的问题。

【讨论】:

    【解决方案2】:

    使用 linq 会有一些小的开销(但无论如何你都在进行微优化)。您可以尝试执行原始 SQL,看看是否有任何性能变化。

    using (MyDataContext db = MyDataContext.GetContext())
    {
       var exists = db.ExecuteQuery<bool>(@"
           SELECT CASE WHEN EXISTS(SELECT NULL FROM EmpTable where t.id == {0}) 
           THEN CAST(1 As bit) 
           ELSE CAST(0 As bit) END", paramId);
       if(exists)
          return null;
    }
    

    除了创建上下文之外,GetContext() 还做了什么?

    【讨论】:

    • GetContext 在我优化的地方花了一些时间。将其标记为答案,因为它有帮助...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多