Тайм-аут выполнения хранимой процедуры в SQL Server. Нужны ли дополнительные индексы? - PullRequest
0 голосов
/ 03 сентября 2018

Я унаследовал следующую хранимую процедуру SQL Server (в Azure SQL Server):

PROCEDURE [Sources].[DeleteRawCaptures]
    (@SourceId BIGINT,
     @Count INT OUTPUT)
AS
BEGIN
    SET NOCOUNT ON
    SET ROWCOUNT 500

    DECLARE @BatchId uniqueidentifier

    SELECT @BatchId = CaptureBatch
    FROM [Data].[RawCaptures]
    WHERE CaptureId = (SELECT MAX(CaptureId)
                       FROM [Data].[RawCaptures]
                       WHERE SourceId = @SourceId)

    DELETE FROM [Data].[RawCaptures] 
    WHERE SourceId = @SourceId
      AND CaptureBatch <> @BatchId

    SET @Count = @@ROWCOUNT
END

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

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

Это индексы, которые являются в данный момент:

enter image description here

Просто для уточнения в случае, если название индекса не дает достаточно информации:

  • Первые поля CaptureBatch и Status
  • Второе поле - CaptureDateTime
  • поля третьего - SourceId и CaptureBatch
  • поля четвертого SourceId и Status
  • Пятое поле - SourceId
  • Шестое поле - Status
  • Седьмые поля: Status и CaptureDateTime

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

Количество данных в Data.RawCaptures начинает расти в геометрической прогрессии. Из-за этого мне интересно, нужен ли мне еще один индекс для этой таблицы (возможно, даже другого типа?) Или если то, что у меня уже есть, должно быть хорошо покрыто. Если последнее так, я начну исследовать другие пути, чтобы определить причину тайм-аутов.

К сожалению, профиль SQL Server не поддерживается в базе данных SQL Azure. Мне нужно найти другой подход.

План выполнения запроса здесь:

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

...