我試圖在包含大約50,000行的表(dbo。[Message])中實現hierarchyID(未來會大幅增長)。但是,需要30-40秒才能檢索到約25個結果。關於SQL Server HierarchyID深度優先性能的問題
爲了提供唯一性,根節點是填充符,因此每個後續行都是該虛擬行的子節點。
我需要能夠遍歷表深度優先,並已取得了HIERARCHYID柱(DBO。[信息] .MessageID)聚類主鍵,還添加了一個計算SMALLINT(DBO。[信息] .Hierarchy ),它存儲節點的級別。
用法:.Net應用程序將hierarchyID值傳遞到數據庫中,我希望能夠檢索該節點的所有(如果有的話)子節點和父節點(除root之外,因爲它是填充符)。
我使用的查詢的簡化版本:
@MessageID hierarchyID /* passed in from application */
SELECT
m.MessageID, m.MessageComment
FROM
dbo.[Message] as m
WHERE
m.Messageid.IsDescendantOf(@MessageID.GetAncestor((@MessageID.GetLevel()-1))) = 1
ORDER BY
m.MessageID
據我瞭解,該指數應自動無提示檢測。
從搜索論壇我看到人們在處理廣度優先索引時使用索引提示,但沒有在深度優先的情況下觀察到這個應用。對我的情況來說,這是一種相關的方法嗎?
我花了這幾天試圖找到解決這個問題,但無濟於事。 我非常感謝任何幫助,因爲這是我的第一篇文章,如果這被認爲是一個'不好的'問題,我會提前道歉,我已經閱讀了MS文檔並搜索了無數論壇,但沒有遇到簡明的描述的具體問題。
順便說一句,你有的查詢?正如所寫的,它總是在整個表中選擇所有節點。 @ MessageID.GetAncestor(@ MessageID.GetLevel() - 1)'把它一直帶到根,然後你選擇所有的後裔,這就是......一切。這就是爲什麼它如此緩慢。 – Aaronaught 2010-04-26 15:01:37
只是爲了澄清:我的情況需要使用深度優先索引,對於混淆 (我指的是廣度優先,最後只是提供一個人們建議使用索引提示的例子) – ObjectiveCat 2010-04-26 15:03:13