0

Моя хранимая процедура занимает очень много времени. Может кто-нибудь предложить мне, что я могу сделать, чтобы ускорить хранимую процедуру, кроме использования некоторых хороших практик для записи запросов. Я слышал о создании индексов, но я не уверен, что это такое. Пожалуйста, предложите все самые лучшие способы ускорить мои запросы. БлагодаряМетоды оптимизации запросов Sql Server

CREATE PROCEDURE [dbo].[usp_GetAlternates] 
(
    @NNumber CHAR(11) , 
    @pid INT , 
    @pbmid INT 
) 
AS 
BEGIN 
    TRUNCATE TABLE TempTherapeuticAlt 
    INSERT INTO TempTherapeuticAlt 
      SELECT NULL AS MedicationID , 
        PR.ePrescribingName AS MedicationName , 
        U.Strength AS MedicationStrength , 
        FRM.FormName AS MedicationForm , 
        PR.DEAClassificationID AS DEASchedule , 
        NULL AS NDCNumber 
      FROM Product PR 
        JOIN (SELECT MP.MarketedProductID 
          FROM  table2 TCTSP 
            JOIN table3 MP ON MP.SpecificProductID = TCTSP.SpecificProductID 
            JOIN (SELECT TCTSP.TherapeuticConceptTreeID 
              FROM  table3 MP 
                JOIN table2 TCTSP ON MP.SpecificProductID = TCTSP.SpecificProductID 
                JOIN (SELECT 
                  PR.MarketedProductID 
                  FROM 
                  table4 PA 
                  JOIN Product PR ON PA.ProductID = PR.ProductID 
                  WHERE 
                  PA.NDC11 = @NNumber 
                 ) PAPA ON MP.MarketedProductID = PAPA.MarketedProductID 
             ) xxx ON TCTSP.TherapeuticConceptTreeID = xxx.TherapeuticConceptTreeID 
         ) MPI ON PR.MarketedProductID = MPI.MarketedProductID 
        JOIN (SELECT P.ProductID , 
            O.Strength , 
            O.Unit 
          FROM  Product AS P 
            INNER JOIN table3 AS M ON P.MarketedProductID = M.MarketedProductID 
            INNER JOIN table5 AS S ON M.SpecificProductID = S.SpecificProductID 
            LEFT OUTER JOIN table6 AS O ON S.SpecificProductID = O.SpecificProductID 
          GROUP BY P.ProductID , 
            O.Strength , 
            O.Unit 
         ) U ON PR.ProductID = U.ProductID 
        JOIN (SELECT PA.ProductID , 
            S.ScriptFormID , 
            F.Code AS NCPDPScriptFormCode , 
            S.FormName 
          FROM  table4 AS PA 
            INNER JOIN table7 AS S ON PA.NCPDPScriptFormCode = S.NCPDPScriptFormCode 
            INNER JOIN table8 AS F ON S.FormName = F.FormName 
          GROUP BY PA.ProductID , 
            S.ScriptFormID , 
            F.Code , 
            S.FormName 
         ) FRM ON PR.ProductID = FRM.ProductID 
      GROUP BY PR.ePrescribingName , 
        U.Strength , 
        FRM.FormName , 
        PR.DEAClassificationID 
      ORDER BY pr.ePrescribingName 


    SELECT LL.ProductID AS MedicationID , 
      temp.MedicationName , 
      temp.MedicationStrength , 
      temp.MedicationForm , 
      temp.DEASchedule , 
      temp.NDCNumber , 
      fs.[ReturnFormulary] AS FormularyStatus , 
      copay.CopaTier , 
      copay.FirstCopayTerm , 
      copay.FlatCopayAmount , 
      copay.PercentageCopay 
    FROM TempTherapeuticAlt temp 
      OUTER APPLY (SELECT TOP 1 
            ProductID 
          FROM  Product 
          WHERE  ePrescribingName = temp.MedicationName 
         ) AS LL 
      OUTER APPLY function1(@pid, LL.ProductID, @pbmid) AS fs 
      OUTER APPLY function2(LL.ProductID, @pbmid) AS copay 
    ORDER BY LL.ProductID 

    TRUNCATE TABLE TempTherapeuticAlt 
END 

GO

+0

Покажите нам хранимую процедуру, если вы хотите получить помощь – Oleksi

+0

С самого начала, самое первое место, которое я сконцентрировал бы на ускорении, которое хранит proc, - это функции (внешний - около нижней). Они могут и часто полностью разрушают производительность. Чтобы узнать, если это так, сделайте версию вашего сохраненного proc, которая их удалила, и посмотрите, какая разница. – hatchet

+0

Сколько строк обычно возвращается из TempTherapeuticAlt? – hatchet

ответ

2

Вот некоторые из них:

  1. Вы должны иметь индексы для каждого столбца в ИНЕКЕ. См. ваш язык SQL для того, как это сделать.
  2. Узнайте, как ОБЪЯВАТЬ ПЛАН и посмотреть, что медленно.
  3. Языки хранимых процедур являются функциональными, а не установлены на основе. Используйте JOIN и не попадайте в ловушку запроса/итерации (n + 1).
  4. Поймите, как использование определенных функций заставляет вас использовать ТАБЛИЦУ SCAN в предложении WHERE.
+0

Возможно, вы правы. Я удалю его. – duffymo

+1

3) Объясните план: Да! Отличный совет. 1) Индексы: НЕПРАВИЛЬНО (если брать буквально). Вы должны * рассмотреть * индексы: да. «Должны иметь индексы»: Нет 4) Хранимые процедуры предлагают * наилучший * как основанный на наборе (SQL), так и процедурный. Если возможно, используйте наборы, а не обработку по отдельности. 2) Порядок столбцов в вопросе «где» * может * изменить ситуацию. Иногда * огромная * разница. – paulsm4

+0

относительно порядка, где см. Http://stackoverflow.com/questions/642784/does-the-order-of-columns-in-a-where-clause-matter. Мой опыт работы с MS Sql Server, и я редко встречался с порядком выражений WHERE, имеющих какой-либо эффект. – hatchet

Смежные вопросы