.net333 Ответов: 1

Повышение производительности SQL-запросов SQL server 2012


Привет,
я создал представление и вызвал его в хранимой процедуре. Текущее время выполнения - 2 секунды.Теперь мне нужно сократить время исполнения с 2 сек до 1/2 сек. мне нужно получить только топ-25 последних ордеров.
Различать и упорядочивать, вызывая проблемы.
Я создал некластеризованный индекс для идентификатора заказа, но безрезультатно.
Пожалуйста, помогите мне улучшить производительность
С уважением,
Рамакришна

Что я уже пробовал:

Смотреть:
SELECT RO.GenerateId, RO.CompanyId, RO.DeliveryDate, RO.DeliveryTime, RO.UserId, RO.Name, APD.AppName, L.LocationName, RO.CreatedDate, RO.ItemState, 
CONVERT(varchar, RO.TotalPrice, 1) AS TotalPrice, CONVERT(varchar, RO.DeliveryFee, 1) AS DeliveryFee, RO.LocationId, CONVERT(varchar, RO.Tax, 1) 
AS Tax, CONVERT(varchar, RO.Tip, 1) AS Tip, RO.EntityType, RO.PromotionCode, RO.PromotionType, RO.TotalWeight, RO.ItemWeight, CONVERT(varchar, 
RO.ConvenienceFeePercentage, 1) AS ConvenienceFee, RO.ConvenienceFee AS ConvenienceFeePercentage, RO.PromotionDiscount, RO.PhoneNumber, 
RO.PaymentType, RO.Note, A.Line1, A.Line2, A.City, A.State, A.Country, A.Zip, RI.CommissionPercentage, RO.Commission, RI.Currency, OCS.AssignedTo, 
RO.GroupId, RO.OrderType, UL.UserId AS UALUserId, RO.ZoneId, OCS.ClaimedBy
FROM  dbo.Locations AS L INNER JOIN
      dbo.Address AS A ON L.AddressId = A.Id INNER JOIN
      dbo.UserAccessLocations AS UL ON L.LocationId = UL.LocationId INNER JOIN
      dbo.AppDetails AS APD ON L.AppId = APD.AppId INNER JOIN
      dbo.RestaurantAppInfo AS RI ON L.AppId = RI.AppId AND 
      L.LocationId = RI.LocationId INNER JOIN
      dbo.OrderClaimStatus AS OCS INNER JOIN
      dbo.RestaurantOrders AS RO ON OCS.OrderId = RO.GenerateId 
      ON L.LocationId = RO.LocationId AND UL.LocationId = RO.LocationId
WHERE (OCS.OrderType IS NULL) AND (RO.DeliveryDate >= DATEADD(day, - 30, GETDATE())) AND (RO.OrderStatus = '1') AND (RO.ItemState <> 'Order Canceled')

хранимая процедура:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER proc [dbo].[GetAllOrders]
as
begin
SET NOCOUNT ON;
select distinct top 25 GenerateId,CompanyId,DeliveryDate,DeliveryTime,UserId,Name,AppName,LocationName,CreatedDate,ItemState,TotalPrice,DeliveryFee,LocationId,Tax,Tip,EntityType,PromotionCode,PromotionType,null as ItemWeight,TotalWeight,
ConvenienceFee,ConvenienceFeePercentage,PromotionDiscount,PhoneNumber,
PaymentType,Note,Line1,Line2,City,State,Country,Zip,CommissionPercentage,Commission,Currency,AssignedTo,GroupId,OrderType
from vwOrdersforManageUsers Order By GenerateId desc
end

Wendelius

Если я правильно понял ваш вопрос, vwOrdersforManageUsers - это представление. Если это так, пожалуйста, опубликуйте запрос, который используется для создания представления.

.net333

Привет Мика,
Спасибо за ваш ответ. да, vwOrdersforManageUsers - это представление. Я выложил просмотр

1 Ответов

Рейтинг:
7

Wendelius

Прежде всего, проверьте, на месте ли соединения. Не уверен, но кажется, что вы можете неуместно ON пункт для следующего

...
INNER JOIN dbo.OrderClaimStatus AS OCS -- ON condition?
INNER JOIN dbo.RestaurantOrders AS RO ON OCS.OrderId = RO.GenerateId 
      ON L.LocationId = RO.LocationId AND UL.LocationId = RO.LocationId ...

После того как вы это сделаете, попробуйте иметь следующие индексы (некоторые из них у вас уже могут быть):
Table               Index columns
----------------    --------------------------------------
Location            AddressId
Location            AppId
Address             Id
UserAccessLocations LocationId
AppDetails          AppId
RestaurantAppInfo   AppId
RestaurantOrders    GenerateId 
RestaurantOrders    LocationId
RestaurantOrders    OrderStatus, ItemState, DeliveryDate
OrderClaimStatus    OrderId
OrderClaimStatus    OrderType

Что приходит в индекс дальше RestaurantOrders содержащий три столбца, если OrderStatus и ItemState вы используете являются общими, то подумайте о размещении DeliveryDate столбец как первый столбец в индексе.


.net333

Спасибо Мика

Wendelius

Пожалуйста :)