我有一個存儲在表中的類別樹,目前有一個傳統的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
分享樣本數據和重新SULT。如果您覺得查詢可以重新設計。 – Recursive 2014-10-10 18:30:19
不幸的是我無法分享數據 - 我已經添加了執行計劃。 – 2014-10-11 09:54:56