2014-10-10 54 views
1

我有一個存儲在表中的類別樹,目前有一個傳統的ParentCategoryId字段和一個名爲Echelon的層次結構域字段。在層次結構域字段SQL Server表上運行有序查詢

下面的查詢成功地翻出通過它們的深度和類別名稱排序在我需要的格式的數據,與深度級別和類別:

WITH q AS 
(
    SELECT 
     c.Id, 
     c.Name, 
     c.Echelon, 
     c.Echelon AS NewEchelon 
    FROM 
     Category c 
    WHERE 
     Deleted IS NULL AND ParentCategoryId IS NULL 

    UNION ALL 

    SELECT 
     c2.Id, 
     c2.Name, 
     c2.Echelon, 
     hierarchyid::Parse(q.NewEchelon.ToString() + CAST(ROW_NUMBER() OVER (ORDER BY q.Name) AS NVARCHAR(MAX)) + '/') 
    FROM 
     q 
    JOIN 
     Category c2 ON c2.Deleted IS NULL AND c2.Echelon.IsDescendantOf(q.Echelon) = 1 AND c2.Echelon.GetLevel() = q.Echelon.GetLevel() + 1 
) 
SELECT * FROM q ORDER BY NewEchelon 

此查詢的性能是不幸的是,不是很好。實際表只有319個類別,其中89個在Deleted列中使用非空值進行軟刪除。是

該查詢的時機如下:

SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

(230 row(s) affected) 

SQL Server Execution Times: 
    CPU time = 218 ms, elapsed time = 321 ms. 

現在第二個三分之一似乎是對我這樣一個小的數據量非常瘋狂。除了集羣PK之外,該表沒有索引。有沒有辦法重寫它,以便它更快?我只需要添加適當的索引?我應該看看存儲我通過上述查詢生成的HierarchySortOrder何時類別或其結構更改?我應該考慮在應用程序級別緩存類別樹嗎?

我的直覺告訴我,這個查詢不應該持續很長時間,而且我很可能錯過了一個技巧,但我會很感激任何有關此事的建議!


下面是執行計劃:

Execution Plan http://s27.postimg.org/mo30oy2yp/executionplam.png Link to full sized image

+0

分享樣本數據和重新SULT。如果您覺得查詢可以重新設計。 – Recursive 2014-10-10 18:30:19

+0

不幸的是我無法分享數據 - 我已經添加了執行計劃。 – 2014-10-11 09:54:56

回答

-1

的處理時間似乎可以公平地我給它的聯合查詢,一些功能和加入 還使用隨着帶來一個子查詢處理時間來考慮

+0

要接受答案,它真的需要解決如何讓我做得更快。 > 300ms可能是'公平的',但是這樣的應用程序的簡單輸出是不可接受的。 – 2014-10-11 10:05:29