0

私は現在、いくつかのストアド プロシージャを最適化する領域を探しています。パフォーマンス分析で、ストアド プロシージャ内の SQL のチャンクがひどいパフォーマンスをしていることに遭遇しました。いくつかの調査を行ったところ、一意のレコードがない場合に with 句を使用することはできないと読んだので、これを書き直したいのですが、問題が発生しています。私が求めている結果を得るにはwhileループが最善の策かもしれないと考えていますが、データの階層を正しく入力することはできません(特に[レベル]フィールド)。これが、私が書き直そうとしている SQL のチャンクです。提案/アイデアは非常に高く評価されます。

;WITH RuleChart (
  RuleID, 
  RuleDetailID, 
  RuleUnitGroupID, 
  ParentRuleUnitGroupID, 
  [Level],
  IsNextRuleUnitGroupAvailable
) AS (

  SELECT 
    DISTINCT RD.RuleID, 
    RD.RuleDetailID, 
    RD.RuleUnitGroupID, 
    RD.ParentRuleUnitGroupID, 
    0 AS [Level],
    RD.IsNextRuleUnitGroupAvailable
  FROM #TtblRuleDetail RD
  WHERE 
    RD.RuleID IN (
        SELECT RuleID 
        FROM #TtblRule 
        WHERE ResultID IN (
          SELECT ResultID
          FROM #TtblResultUnit
        )
    )
    AND RD.ParentRuleUnitGroupID IS NULL

    UNION ALL

    SELECT 
      RD.RuleID, 
      RD.RuleDetailID, 
      RD.RuleUnitGroupID, 
      RD.ParentRuleUnitGroupID, 
      [Level] + 1,
      RD.IsNextRuleUnitGroupAvailable
    FROM 
      #TtblRuleDetail RD
      INNER JOIN RuleChart RC 
        ON
          RD.ParentRuleUnitGroupID = RC.RuleUnitGroupID
          AND RD.RuleID=RC.RuleID
)
4

1 に答える 1

0

使用している一時テーブルのサイズに大きく依存します。この WITH 句の前にインデックスを作成しますか? ステートメントを見るだけで、#TtblRuleDetail.RuleID にインデックスを作成し、#TtblRuleDetail.ParentRuleUnitGroupID に別のインデックスを作成できるように見えます。それはおそらくパフォーマンスに役立ちますが、クエリの高速化に役立つソーステーブルに既にインデックスがある可能性があるため、一時テーブルを完全に削除することをお勧めします。

于 2013-05-14T18:34:22.917 に答える