SQL Стратегия настройки запросов к серверу - PullRequest
0 голосов
/ 26 мая 2020

Я новичок в настройке запросов и использую инструменты Брента Озара для определения дорогостоящих хранимых процедур. Это вызвало предупреждения для параллельного, плановых предупреждений, анализа параметров, нижнего уровня CE, неявных преобразований, тривиальных планов и низкозатратных высокопроизводительных процессоров. Мне нужна стратегия для атаки на план запроса ниже:

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

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Ваша процедура содержит 7 запросов (операторов), и почти каждый из них имеет проблему:

  • Query1: сниффинг параметров, простой план
  • Query2: параллелизм, анализ параметров
  • Query3: тривиальный план
  • Query4: неявное преобразование, низкая стоимость + высокая загрузка процессора
  • Query5: OK
  • Query6: OK
  • Query7 : OK

    И Legacy CE для всей процедуры.

0 голосов
/ 26 мая 2020

Если сметные затраты на запросы точны, вам нужно беспокоиться только об одном, и его легко исправить.

Удалите ненужный RTRIM и добавьте OPTION RECOMPILE, чтобы получить план, основанный на фактических параметрах, передаваемых при каждом выполнении. См. Classi c Dynami c Условия поиска в T SQL для получения дополнительной информации.

Измените

SELECT @CustomerNumber = CustomerNumber
FROM DMVData dd
WHERE ((@PINNumber IS NULL) OR (dd.PINNumber = @PINNumber)) 
 AND ((@TagNumber IS NULL) OR (RTRIM(dd.PlateNumber) = @TagNumber))
 AND ((@VIN IS NULL) OR (RTRIM(dd.VIN) = @VIN))
 AND ((@DriversLicense IS NULL) OR (dd.DLNumberOne = @DriversLicense) OR (dd.DLNumberTwo = @DriversLicense))
 AND ((@Title IS NULL) OR (TitleNumber = @Title))
 AND ((@DOB IS NULL) OR (dd.DOBOne = @DOB) OR (dd.DOBTwo = @DOB))

на

SELECT @CustomerNumber = CustomerNumber
FROM DMVData dd
WHERE ((@PINNumber IS NULL) OR (dd.PINNumber = @PINNumber)) 
 AND ((@TagNumber IS NULL) OR (dd.PlateNumber = @TagNumber))
 AND ((@VIN IS NULL) OR (dd.VIN = @VIN))
 AND ((@DriversLicense IS NULL) OR (dd.DLNumberOne = @DriversLicense) OR (dd.DLNumberTwo = @DriversLicense))
 AND ((@Title IS NULL) OR (TitleNumber = @Title))
 AND ((@DOB IS NULL) OR (dd.DOBOne = @DOB) OR (dd.DOBTwo = @DOB))
OPTION (RECOMPILE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...