SQL - сделайте это утверждение быстрее, т.е. меньше продолжительности, читает - PullRequest
1 голос
/ 17 сентября 2010

С учетом следующих таблиц:

Orders (OrderID, OrderStatus, OrderNumber) 
OrderItems(OrderItemID, OrderID, ItemID, OrderItemStatus)

заказов: 2537 записей Позиции заказа: 1319 записей

Я создал индексы на

  1. Заказы (OrderStatus)
  2. ТоварыЗаказ (OrderID)
  3. ТоварыЗаказ (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'

Есть ли что-нибудь еще, что я могу сделать, чтобы сделать это быстрее?

Ответы [ 3 ]

1 голос
/ 17 сентября 2010

делает все эти параметры nvarchars varchars, если столбцы в таблице являются varchars

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

См. Также здесь: sp_executesql, вызывающий очень медленный запрос

0 голосов
/ 17 сентября 2010

Это может привести к лучшему 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();
0 голосов
/ 17 сентября 2010

рассчитывать на один индекс, а не *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...