У меня большие проблемы с оптимизацией определенного SQL-запроса. Он содержит несколько внутренних соединений и добавление индексов в каждую таблицу не улучшает производительность вообще.SQL Server - Создать индекс для запроса по нескольким таблицам?
Мой запрос:
declare @categoryid int = 2;
SELECT [Scanresultebay].Id
, [Scanresultebay].Productebayid
, [Scanresultebay].Price
, [Scanresultebay].Stockamount
, [Scanresultebay].Timestamp
, [Category].Categoryname
, (
SELECT TOP 1 [Scanresultebay].price
FROM [Scanresultebay]
INNER JOIN [Productebay] ON [Productebay].id = .[Scanresultebay].productebayid
INNER JOIN [EbaySeller] on [EbaySeller].id = [ProductEbay].ebaysellerid
WHERE [dbo].[EbaySeller].id = 28
and [ProductEbay].categoryid = @categoryid
ORDER BY [Scanresultebay].Id DESC
) AS 'OurPrice'
FROM [Scanresultebay]
INNER JOIN [Productebay] ON [Productebay].Id = [Scanresultebay].productebayid
INNER JOIN [Category] ON [Category].Id = [Productebay].categoryid
WHERE [Scanresultebay].productebayid in (
SELECT [Scanresultebay].productebayid
FROM [Scanresultebay]
INNER JOIN [ProductEbay] ON [ProductEbay].id = [ScanResultEbay].ProductEbayId
INNER JOIN [Category] ON [Category].Id = ProductEbay.CategoryID
WHERE [ProductEbay].categoryid = @categoryid and [ProductEbay].expired is null
GROUP BY [Scanresultebay].ProductEbayId
)
and [Scanresultebay].Id in (
SELECT max(Id)
FROM [Scanresultebay]
WHERE productebayid = [Scanresultebay].ProductEbayId
and [Scanresultebay].Price <> 0
GROUP BY [Scanresultebay].[ProductEbayId]
);
Мой индекс (как SQL Server предложил мне):
CREATE NONCLUSTERED INDEX [ind_GetPrice]
ON [dbo].[ScanResultEbay] ([Id],[ProductEbayId]) include ([Stockamount], [Timestamp], [Price])
мне нужен этот запрос для отображения Infos на приборной панели на моем сайте. Поэтому я должен пройти через каждую категорию (всего 100) с этим запросом. Это длится до 30-40 секунд, что слишком много.
Создание представления является проблемой, так как я должен объявить параметр categoryid для подзапросов, а параметры не могут быть переданы в представление.
Так мои вопросы:
- Могу ли я сделать определенный индекс только для этого запроса, поэтому он получает намного быстрее (в настоящее время она занимает 0,5sec).
- Является ли мой запрос слишком длинным (или недействительным) из-за этих подзапросов?
- Что я могу сделать еще, чтобы улучшить свою производительность?
Первое, что нужно сделать, это посмотреть план выполнения. Один совет, который я могу вам дать, это попытаться изменить операторы 'in' на' exist'. –
просто хочу исключить параметр sniffing: , пожалуйста, добавьте опцию (recomple) в конце запроса и сообщите нам –
для меня, похоже, CROINALITY ISSUE .. вы можете материализовать свое условие 2 IN в TEMP TABLE, если данные не огромный? –