Linq to sql SQL-使此语句更快,即持续时间更短,读取次数更少

Linq to sql SQL-使此语句更快,即持续时间更短,读取次数更少,linq-to-sql,sql,Linq To Sql,Sql,鉴于下表: Orders (OrderID, OrderStatus, OrderNumber) OrderItems(OrderItemID, OrderID, ItemID, OrderItemStatus) 订单:2537份 订购项目:1319项记录 我已经在上创建了索引 订单(订单状态) OrderItems(OrderID) OrderItems(OrderItemStatus) 我有以下SQL语句(由LinqToSql生成),执行该语句时: -持续时间=8789 -读数=7809

鉴于下表:

Orders (OrderID, OrderStatus, OrderNumber) 
OrderItems(OrderItemID, OrderID, ItemID, OrderItemStatus)
订单:2537份 订购项目:1319项记录

我已经在上创建了索引

  • 订单(订单状态)
  • OrderItems(OrderID)
  • OrderItems(OrderItemStatus)
  • 我有以下SQL语句(由LinqToSql生成),执行该语句时: -持续时间=8789 -读数=7809

    exec sp_executesql N'SELECT COUNT(*) AS [value]
    FROM [dbo].[Orders] AS [t0]
    WHERE ([t0].[OrderStatus] = @p0) OR (EXISTS(
        SELECT NULL AS [EMPTY]
        FROM [dbo].[OrderItems] AS [t1]
        WHERE ([t1].[OrderID] = [t0].[OrderID]) AND ([t1].[OrderItemStatus] = @p1)
        ))',N'@p0 nvarchar(2),@p1 nvarchar(2)',@p0=N'KE',@p1=N'KE'
    

    还有什么我可以做得更快的吗?

    如果表中的列是varchars,则将所有这些nvarchars参数设置为varchars

    ))',N'@p0 varchar(2),@p1 varchar(2)',@p0=N'KE',@p1=N'KE'
    

    另请参见此处:

    如果表中的列是varchars,则将所有这些nvarchars参数设置为varchars

    ))',N'@p0 varchar(2),@p1 varchar(2)',@p0=N'KE',@p1=N'KE'
    

    另请参见此处:

    使用单个索引而不是*

    使用单个索引而不是*

    这可能会生成更好的sql

    IQueryable<int> query1 =
      from oi in db.OrderItems
      where oi.OrderItemStatus == theItemStatus
      select oi.OrderID;
    
    IQueryable<int> query2 =
      from o in db.Orders
      where o.OrderStatus == theOrderStatus
      select o.OrderID;
    
    IQueryable<int> query3 = query1.Concat(query2).Distinct();
    
    int result = query3.Count();
    
    IQueryable查询1=
    来自db.OrderItems中的oi
    其中oi.OrderItemStatus==ItItemStatus
    选择oi.OrderID;
    可查询的查询2=
    以db.订单形式从o开始
    其中o.OrderStatus==theOrderStatus
    选择o.OrderID;
    IQueryable query3=query1.Concat(query2.Distinct();
    int result=query3.Count();
    
    这可能会生成更好的sql

    IQueryable<int> query1 =
      from oi in db.OrderItems
      where oi.OrderItemStatus == theItemStatus
      select oi.OrderID;
    
    IQueryable<int> query2 =
      from o in db.Orders
      where o.OrderStatus == theOrderStatus
      select o.OrderID;
    
    IQueryable<int> query3 = query1.Concat(query2).Distinct();
    
    int result = query3.Count();
    
    IQueryable查询1=
    来自db.OrderItems中的oi
    其中oi.OrderItemStatus==ItItemStatus
    选择oi.OrderID;
    可查询的查询2=
    以db.订单形式从o开始
    其中o.OrderStatus==theOrderStatus
    选择o.OrderID;
    IQueryable query3=query1.Concat(query2.Distinct();
    int result=query3.Count();
    
    你能说明为什么会这样吗?你能证明为什么会这样吗?