0

ストアド プロシージャの実行に非常に時間がかかります。クエリを書き留めるためのいくつかの優れたプラクティスを使用することを除いて、ストアドプロシージャを高速化するために何ができるかを誰かに提案してもらえますか? インデックスの作成について聞いたことがありますが、それらが何であるかわかりません。クエリを高速化する最善の方法をすべて提案してください。ありがとう

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

行く

4

1 に答える 1

2

ここにいくつかあります:

  1. WHERE 句のすべての列にインデックスが必要です。その方法については、SQL 言語を参照してください。
  2. EXPLAIN PLAN の方法を学び、何が遅いのかを確認してください。
  3. ストアド プロシージャ言語は関数型であり、セット ベースではありません。JOIN を使用し、(n+1) クエリ/反復トラップに陥らないようにします。
  4. 特定の関数を使用すると、WHERE 句で TABLE SCAN が強制されることを理解します。
于 2012-05-27T00:07:55.283 に答える