【问题标题】:Sql Select Query PerformanceSql 选择查询性能
【发布时间】:2012-01-06 15:44:19
【问题描述】:

我有以下查询需要将近 1 分钟才能执行。

public static Func<Entities, string, IQueryable<string>> compiledInvoiceQuery =
          CompiledQuery.Compile((Entities ctx, string orderNumb) =>
                    (from order in ctx.SOP10100
                    where order.ORIGNUMB == orderNumb
                    select order.SOPNUMBE).Union(
                                                from order in ctx.SOP30200
                                                where order.ORIGNUMB == orderNumb
                                                select order.SOPNUMBE)
                                                );

它根据不是我的主键的 ORIGNUMB 进行过滤,我什至不能在上面放置任何索引。我们还有其他方法可以让它更快吗?我在sql server上测试,发现只有查询

from order in ctx.SOP10100
where order.ORIGNUMB == orderNumb
select order.SOPNUMBE

或

select SOPNUMBE
from SOP10100
where ORIGNUMB = @orderNumb

耗时超过 55 秒。请提出建议。

【问题讨论】:

  • 由于 ORIGNUMB 是您选择标准的唯一元素,因此无法通过索引该特定列来提高性能。
  • 如果您无法创建索引,那么您唯一的选择似乎就是重写查询,可能是为了更具选择性(但不太可能没有索引)。
  • :) 我的 DBA 不允许。实际上不确定,可能是因为桌面需要频繁更新,我只是在处理一个模块并且没有完整的可见性。

标签: sql-server linq sql-server-2005 entity-framework linq-to-entities


【解决方案1】:

如果在服务器上需要 55 秒,那么现在与 linq 相关。 为什么你不能有一个索引,因为你需要一个......

在您开始搜索订单号匹配之前,唯一的其他选择是重新调整您的逻辑以过滤掉记录(使用索引列)。

【讨论】:

    【解决方案2】:

    LINQ to SQL 的一个大问题是您几乎无法控制正在生成的 SQL。

    由于您运行的是联合而不是连接,因此它应该是一个非常简单的 SQL。像这样的:

    SELECT * 
    FROM SOP10100
    WHERE ORIGNUMB  = 'some number'
    UNION
    SELECT * 
    FROM SOP30200
    WHERE ORIGNUMB  = 'some number'
    

    您可以使用 SQL Server Profiler 查看针对数据库运行的 SQL 语句,以查看 SQL 是这样的还是更复杂的。然后,您可以运行 SQL Server Management Stuido 中生成的 SQL,并打开 Include Client Statistics 和 Include Actual Execution Plan 以查看究竟是什么导致了性能问题。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2016-01-09
      • 1970-01-01
      • 2018-04-12
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      相关资源
      最近更新 更多