私は現在、いくつかのストアド プロシージャを最適化する領域を探しています。パフォーマンス分析で、ストアド プロシージャ内の 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
)