2013-05-14 48 views
0

我目前正在尋找一些方面來優化我們的一些存儲過程,並且我在性能分析中運行了一個存儲過程中的SQL塊,它只是表現非常糟糕。我已經做了一些研究,並且我已經閱讀過,當你沒有獨特的記錄時使用with子句是一個禁忌,所以我想重寫這個,但是我有麻煩。我在想一段時間循環可能是我最好的選擇,爲了達到我之後的結果,但是我無法正確填充數據的層次結構(特別是[level]字段)。這是我想要重寫的SQL塊。任何建議/想法將非常感激。WITH子句性能問題;重寫入While循環?

;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 
) 
+0

我格式化了您的代碼。 – plalx 2013-05-14 02:05:36

+0

對不起,謝謝! – user2379852 2013-05-14 02:39:32

回答

0

很大程度上取決於您正在使用的臨時表的大小。他們有多大,你是否在這個WITH子句之前爲它們創建了索引?從查看語句看來,您可以在#TtblRuleDetail.RuleID上創建索引,並在#TtblRuleDetail.ParentRuleUnitGroupID上創建另一個索引。這可能會對性能有所幫助,但更好的方法可能是完全取消臨時表,因爲您可能已經在源表上有索引來幫助加快查詢速度。

+0

我同意,刪除臨時表將是一個很大的幫助。不幸的是,在當前的體系結構中,上面使用的這些臨時表是從傳遞到proc的XML加載的。在臨時表上沒有創建索引,所以我可以嘗試這樣做。這些表格最多會有6-8,000個記錄,但它絕對是系統中的一個性能表現。 – user2379852 2013-05-15 17:56:29