2013-04-26 100 views
-1
Create table #tmptble(RuleId, SubjectId, RID, Date) 

Insert into #tmptble(RuleId,SubjectId, RID, Date) 
Select RuleTable.RuleId, RuleTable.SubjectId, KeyTable.RID, KeyTable.ParentId 
FROM RuleTable INNER JOIN KeyTable 
ON KeyTable.RID = RuleTable.RID 

此查詢非常慢。我在KeyTable的RID,RuleTable上的RuleId上的聚簇索引,RuleTable上的RuleId + SubjectId上的唯一非聚簇索引上有聚簇索引。 (RuleTable以各種其他地方使用)如何優化此查詢

在上述查詢,如果我介紹等

Insert into #tmptble(RuleId,SubjectId, RID, Date) 
Select RuleTable.RuleId, RuleTable.SubjectId, KeyTable.RID, KeyTable.ParentId 
FROM RuleTable INNER JOIN KeyTable 
ON KeyTable.RID = RuleTable.RID 
WHERE KeyTable.RID = @RID -- @RID is passed into the storedproc 

的運行時間由> 50%的減少了where子句。但問題是,我通過以下方式

WITH ResourceTree AS 
(
    SELECT 
    #tmptble.RuleId AS [RuleId], 
    #tmptble.SubjectId AS [SubjectRecId], 
    #tmptble.RId AS [RId], 
    #tmptble.ParentID AS [ParentID]      
    FROM #tmptble WHERE #tmptble.SubjectId = @SubjectId 
    AND #tmptble.RId = @RId 

    UNION ALL 

    -- Recursive step 
     -- Note that the recursive step uses the results from original #tmptable 
    SELECT 
    #tmptble.RuleId AS [RuleId], 
    #tmptble.SubjectId AS [SubjectId], 
    #tmptble.RId AS [RId], 
    #tmptble.ParentID AS [ParentID]      
    FROM #tmptble INNER JOIN ResourceTree RT 
    ON RT.ParentID = #tmptble.RId 
) 

SELECT * 
FROM ResourceTree 

有沒有辦法來優化這個查詢使用原始表的結果,而不WHERE條款?任何有關指數或那種方式建議遞歸做將是有益的

回答

0

這可能是有益的你 -

;WITH temp AS 
(
    SELECT 
      r.RuleId 
     , r.SubjectId 
     , r.RID 
     , k.ParentId 
    FROM (
     SELECT r.* 
     FROM dbo.RuleTable r 
     WHERE r.RID = @RID 
    ) r 
    JOIN dbo.KeyTable k ON k.RID = r.RID 
) 
, ResourceTree AS 
(
    SELECT 
      t.RuleId 
     , [SubjectRecId] = t.SubjectId 
     , t.RId 
     , t.ParentID     
    FROM temp t 
    WHERE t.SubjectId = @SubjectId 

    UNION ALL 

    SELECT 
      t.RuleId 
     , t.SubjectId 
     , t.RId 
     , t.ParentID     
    FROM temp t 
    WHERE EXISTS (
     SELECT 1 
     FROM ResourceTree r 
     WHERE r.ParentID = t.RId 
    ) 
) 
SELECT * 
FROM ResourceTree