WITH条款的执行问题;重写为While循环



我目前正在寻找优化一些存储过程的领域,我在性能分析中遇到了一个存储过程中的SQL块,它的性能非常糟糕。我做了一些研究,我读到,使用与子句,当你没有唯一的记录是一个禁忌,所以我想重写这个,但我有麻烦。我认为while循环可能是我最好的选择,以实现我所追求的结果,但我不能得到数据的层次结构来正确填充(特别是[level]字段)。这是我试图重写的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
)

这在很大程度上取决于您正在使用的临时表的大小。它们有多大,在WITH子句之前是否创建了索引?从语句来看,似乎可以在#TtblRuleDetail上创建一个索引。另一个是#TtblRuleDetail.ParentRuleUnitGroupID。这可能有助于提高性能,但更好的方法可能是完全消除临时表,因为源表上可能已经有了有助于加快查询速度的索引。

最新更新