0

我目前正在研究优化我们的一些存储过程的领域,并且我在性能分析中遇到过,存储过程中的一段 SQL 表现非常糟糕。我已经做了一些研究,并且我已经读到当你没有唯一记录时使用 with 子句是不可以的,所以我想重写它,但我遇到了麻烦。我认为 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
)
4

1 回答 1

0

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

于 2013-05-14T18:34:22.917 回答