оптимизация скрипта в sql - PullRequest
       6

оптимизация скрипта в sql

0 голосов
/ 26 апреля 2019

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

Я пытался использовать nolock, но не так много уважения

SELECT RR.ReportID,
       RR.RequestFormat,
       RRP.SequenceNumber,
       RRP.ParameterName,
       RRP.ParameterValue
       CASE WHEN RP.ParameterLabelOvrrd IS NULL THEN P.ParameterLabel ELSE .ParameterLabelOvrrd END AS ParameterLabelChosen,
       RRP.ParameterValueEntered
FROM ReportRequestParameters AS RRP WITH (NOLOCK)
     INNER JOIN ReportRequests AS RR WITH (NOLOCK) ON RRP.RequestID = RR.RequestID
     INNER JOIN ReportParameter AS RP WITH (NOLOCK) ON RP.ReportID = RR.ReportID
                                                   AND RP.SequenceNumber = RRP.SequenceNumber
     INNER JOIN Parameter AS P WITH (NOLOCK) ON P.ParameterID = RP.ParameterID
WHERE RRP.RequestID = '2226765'
ORDER BY SequenceNumber;

Пожалуйста, совет.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Это ваш запрос:

SELECT RR.ReportID, RR.RequestFormat, RRP.SequenceNumber, 
       RRP.ParameterName,  RRP.ParameterValue 
       COALESCE(RP.ParameterLabelOvrrd, P.ParameterLabel) as ParameterLabelChosen,
       RRP.ParameterValueEntered
FROM ReportRequestParameters RRP JOIN
     ReportRequests RR 
     ON  RRP.RequestID = RR.RequestID JOIN
     ReportParameter RP 
     ON RP.ReportID = RR.ReportID AND
        RP.SequenceNumber = RRP.SequenceNumber JOIN
     Parameter P 
     ON P.ParameterID = RP.ParameterID
WHERE RRP.RequestID = 2226765
ORDER BY RRP.SequenceNumber;

Я удалил одинарные кавычки на 2226765, предполагая, что id - это число. Смешивание может помешать оптимизатору.

Тогда я рекомендую индекс для ReportRequestParameters(RequestID, SequenceNumber). Я предполагаю, что другие таблицы имеют индексы на соответствующих столбцах, но это:

  • ReportRequests(RequestID, ReportID, SequenceNumber)
  • ReportParameter(ReportID, SequenceNumber, ParameterID)
  • Parameter(ParameterID)

Я настоятельно советую вам не использовать nolock, если вы не знаете, что делаете. Аарон Бертран имеет хороший пост в блоге на эту тему.

0 голосов
/ 26 апреля 2019

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

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

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