Выполнение хранимой процедуры занимает много времени при возврате количества строк

У меня есть хранимая процедура, как это:

ALTER procedure [dbo].[IBS_fetchreleasedinpodiumgridnew]
   @locid INTEGER = NULL
AS BEGIN
   SET NOCOUNT ON

   DECLARE @TodayMinus7Days DATETIME
   SET @TodayMinus7Days = getdate()-7

   SELECT  
       t.TBarcode, t.PlateNo, t.DelEcode,
       cast(t.Paydate as Time) [REQ],
       datediff(MINUTE, t.PayDate,
                CASE t.Status
                   WHEN 3 THEN GETDATE()
                   WHEN 4 THEN t.KeyRoomDate
                   WHEN 5 THEN  t.KeyRoomDate
                END) as KRRT,
       datediff(MINUTE, t.PayDate,
                CASE t.Status
                   WHEN 3 THEN GETDATE()
                   WHEN 4 THEN GETDATE()
                   WHEN 5 THEN t.DelDate
                END) as DT
   FROM    
       dbo.Transaction_tbl t
   WHERE   
      (([status] IN (3,4))
      OR 
      ([status] = 5 AND DATEDIFF(n, DelDate, GETDATE()) <= 3)
      )
      AND locid = 6 
      AND dtime >= @TodayMinus7Days
   ORDER BY  
       paydate 
end

У меня есть некластеризованный индекс на Locid, dtime колонны.

В моей таблице более 4 записей о недостатках. При возврате более 25 строк выполнение занимает много времени (иногда 30 секунд, иногда 45 секунд). Почему это происходит? Как я могу выполнить мою хранимую процедуру быстрее?

Кто-то предложил добавить этот код

OPTION (OPTIMIZE FOR (@TodayMinus7Days UNKNOWN))

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

Любая помощь приветствуется!

это мой план выполнения запроса

введите описание изображения здесь

1 ответ

Идея "оптимизировать для" не является необоснованной.
Идея состоит в том, чтобы сказать механизму БД не предполагать, что первое значение даты, используемое с этим процессом, типично при составлении плана выполнения.

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

План выполнения показывает 2 вещи.

Во-первых, самая медленная вещь - это Сортировка == ваш Заказ по. Сорта всегда медленные и плохо масштабируются. Если по какой-либо причине вам это действительно не нужно, удаление Order By окажет наибольшее влияние. Если вам действительно нужен Order By, единственный способ устранить сортировку - добавить индекс в столбец Order By... и использовать его.
Как и в случае с любым индексным решением, вы должны взвесить все за и против его добавления.

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

Другие вопросы по тегам