низкая производительность запросов с разделом и макс - PullRequest
0 голосов
/ 21 декабря 2018

этот запрос с низкой производительностью ... что я сделал не так?Пожалуйста, помогите мне, это выполняется сотни раз в моей системе, решение, которое даст мне лестницу в небеса

Я проверил систему с помощью sp_Blitz, и никаких проблем со смертельным исходом не найдено

Вотзапрос:

SELECT MAX(F.id) OVER (PARTITION BY idstato ORDER BY F.id DESC) AS id
FROM jfel_tagxml_invoicedigi F
     INNER JOIN jfel_invoice_state S ON F.id = S.idinvoice
WHERE S.idstato = @idstato
  AND S.id = F.idstatocorrente
  AND F.sequence_invoice % @number_service_installed = @idServizio
ORDER BY F.id DESC,
         F.idstatocorrente OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

Вот план запроса

https://www.brentozar.com/pastetheplan/?id=SyYL5JOeE

Я могу отправить вам лично мои системные свойства

обновление: сделано несколькомодификация, это лучше, но я думаю, что это может быть лучше ... вот новый запрос:

SELECT MAX(F.id) AS id
FROM jfel_tagxml_invoicedigi F
     INNER JOIN jfel_invoice_state S ON F.id = S.idinvoice
WHERE S.idstato = @idstato
  AND S.id = F.idstatocorrente
  AND F.sequence_invoice % @number_service_installed = @idServizio;

И новый план: https://www.brentozar.com/pastetheplan/?id=SJ-5GDqeE

обновление: внесены некоторые изменения, это лучше, но я думаю, что могло бы быть лучше ... вот новый запрос:

SELECT top 1 F.id as id 
FROM jfel_tagxml_invoicedigi AS F 
INNER JOIN jfel_invoice_state AS S 
ON F.idstatocorrente = S.id
WHERE S.idstato= 1 AND S.id = F.idstatocorrente 
and S.datastato > dateadd(DAY,-5,getdate())
AND F.progressivo_fattura % 1 = 0
ORDER BY S.datastato

и новый новый план https://www.brentozar.com/pastetheplan/?id=S1xRkL51S

Ответы [ 4 ]

0 голосов
/ 28 июня 2019

Агрегация всех окон имеет очень большое снижение производительности.Попытайтесь использовать этот механизм перемещения окна за пределы базы данных (т.е. в ОЗУ вашего приложения), что станет универсальным способом его оптимизации.

В противном случае вы можете попытаться выделить больше ОЗУ для каждого раздела базы данных (в PostgreSQL вы можете настроить это с помощью параметра. В другой базе данных вы можете или не можете).

Основная причина, по которой он занимает очень много времени (медленно), заключается в том, что он вызывает сортировку и материализацию отсортированной таблицы.

0 голосов
/ 21 июня 2019

Фильтрация по вычисленным полям, которые негативно влияют на производительность.Сначала вы можете выполнить другие фильтры, а в качестве последнего шага - рассчитать фильтр, чтобы было меньше строк для сопоставления.Может быть, он заполнит TEMPDB, потому что там будет храниться промежуточный набор записей, но в этом случае вы либо увеличите его размер, либо воспользуетесь другим методом.
Вот ваш второй запрос, написанный следующим образом (возможно, вам нужно настроить его,Я только что написал это в Notepad ++:

SELECT MAX(id) AS id
FROM (
    SELECT F.id, F.sequence_invoice % @number_service_installed as [idServizio]
    FROM jfel_tagxml_invoicedigi F
         INNER JOIN jfel_invoice_state S ON F.id = S.idinvoice
    WHERE S.idstato = @idstato
        AND S.id = F.idstatocorrente
        -- AND F.sequence_invoice % @number_service_installed = @idServizio
)
WHERE idServizio = @idServizio
;

Вместо подзапроса вы можете попробовать также временную таблицу или CTE, возможно, один из них - явный победитель над другими, стоит попробовать всем, если хотитемаксимальная производительность.

0 голосов
/ 25 июня 2019

Расчет данных не является аргументом Sargable, вы можете попробовать использовать переменную с OPTION RECOMPILE:

DECLARE @d Date
SET @d = dateadd(DAY,-5,getdate())

SELECT top 1 F.id as id 
FROM jfel_tagxml_invoicedigi AS F 
INNER JOIN jfel_invoice_state AS S 
ON F.idstatocorrente = S.id
WHERE S.idstato= 1 AND S.id = F.idstatocorrente 
and S.datastato > @d
AND F.progressivo_fattura % 1 = 0
ORDER BY S.datastato
OPTION (RECOMPILE)
0 голосов
/ 21 июня 2019

Я думаю, вам нужен NONCLUSTERED INDEX для вашего запроса, который вы описали выше.

Если у вас нет представления о INDEX , я имею в виду, что вы не можете идентифицировать ведьмуполе вашей таблицы NONCLUSTERED INDEX тогда нужно просто, вы просто создаете план выполнения из SQL Server 2008 Management Studio, а аналитика SQL Server выдает недостающие детали индекса и показывает зеленый цвет текста, который представляет детали отсутствующего индекса.

вы можете перемещать указатель мыши на отсутствующий текст указателя, а SQL Server 2008. Интеллектуальная среда Management Studio покажет код T-SQL, необходимый для создания отсутствующего индекса, или вы можете нажать правую кнопку мыши.на отсутствующем тексте индекса, затем выберите опцию отсутствующих подробностей индекса из списка, чтобы просмотреть подробную информацию об отсутствующем индексе.

Дополнительную информацию можно найти в этой статье Создание отсутствующего индекса из плана фактического выполнения

Надеюсь, это решение поможет вам.

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