2

給定一個表(AccountId,ParentId NULL),我們希望能夠快速找到: 1.主父ID(parentId爲null的accountId)。 2.所有孩子給定的帳戶ID。實現CTE或以其他方式提高性能

使用CTE,這相當容易。但是,我們無法將CTE保存在索引視圖中,這會損害性能。我們已經嘗試了一些其他的想法,比如將路徑(id1/id2/id3)保存在另一個字段中,但是這感覺很亂。

我們想到了一個觸發器,它可以在每一行上保存「主」ID,但我們不確定在鏈中間如何工作(1擁有2擁有3,但是2轉移到7)。它也不能解決「查找所有孩子」的查詢。

有什麼想法?我們正在使用SQL 2008 R2,但可以遷移到SQL 2012.

+0

我不認爲SQL Server 2012有任何功能,這將有助於這裏。然而,如果沒有更多的上下文來理解爲什麼實現CTE或創建索引視圖(什麼?)將成爲解決性能問題的神奇答案,那麼這非常困難。你能給我們一些關於表結構,索引,數據量和你運行的查詢太慢的想法嗎? – 2012-03-13 00:51:56

+0

您是否擁有ParentId的索引範圍? – wtjones 2012-04-04 18:25:07

回答

1

在SQL 2008中,有一個hierarchyid類型,它基本上實現了保存到根的路徑。 http://technet.microsoft.com/en-us/library/bb677290%28v=sql.100%29.aspx

如果您的層次結構大部分是靜態的,其他選項是將此表的非規格化版本與每個後代的父項組合在一起。所以,如果您的層次結構是A是B的父母誰是C的父母,非規範化的表可以這個樣子

parent child depth 
A  A  0 
A  B  1 
A  C  2 
B  B  0 
B  C  1 
C  C  0 

現在,如果你指數的家長和孩子塔兩者,搜索分級結構變得非常快。