我目前有一個閉包表,用於具有500萬個節點的分層數據,這導致閉包表中約7500萬行。使用SqLite,由於封閉表的大小,我的查詢時間呈指數增長。關閉表根節點用10幾百萬個節點查詢性能
CREATE TABLE `Closure` (`Ancestor` INTEGER NOT NULL ,`Descendant` INTEGER NOT NULL ,`Depth` INTEGER, PRIMARY KEY (`Ancestor`,`Descendant`))
CREATE INDEX `Closure_AncestorDescendant` ON `Closure` (`Ancestor` ASC, `Descendant` ASC);
CREATE INDEX `Closure_DescendantAncestor` ON `Closure` (`Descendant` ASC, `Ancestor` ASC);
CREATE TABLE `Nodes` (`Node` INTEGER PRIMARY KEY NOT NULL, `Root` BOOLEAN NOT NULL, `Descendants` INTEGER NOT NULL);
我查詢發現,有根需要用這麼多節點約20分鐘,儘管只有約5或6個節點滿足查詢的節點。
SELECT `Closure`.`Ancestor` FROM `Closure`
LEFT OUTER JOIN `Closure` AS `Anc` ON `Anc`.`Descendant` = `Closure`.`Descendant`
AND `Anc`.`Ancestor` <> `Closure`.`Ancestor` WHERE `Anc`.`Ancestor` IS NULL;
20分鐘至長,所以現在我存儲用於如果該節點是一個根一個bool和修改Nodes
。 Root
列當節點被移動..我不完全滿意重複數據,但我的查詢時間現在在每個查詢的單位數毫秒。
我還有很多查詢需要知道給定節點有多少個後代(大多數情況下,如果後代> 1,以瞭解此對象是否可以在樹視圖中虛擬化/擴展)。我以前每次需要時都會詢問這個問題,但是在一個巨大的數據庫中,就像我甚至用索引查詢似乎需要很長時間(超過1秒)一樣,所以我也將它們減少到了Nodes
。 Descendants
列,我每次移動節點時也會更新。不幸的是,這是我想避免的另一個重複數據。
我以前使用的查詢如下所示。如果任何人都可以解釋如何提高性能(考慮到我已經有一個以祖先爲起點的索引),我將不勝感激。
SELECT COUNT(*) FROM `Closure` WHERE `Ancestor`[email protected]
你的閉包表的模式是什麼?有索引嗎?另外,你是什麼意思「找到根節點」? – 2012-01-20 21:36:31
對不起,這是一個錯字。我的意思是「查找根源的節點」並且它已被更正。無論如何,我大多重寫了我的問題,因爲我們想出瞭如何正確編寫索引,這些索引增加了除「Root」查詢和「Count Descendants」查詢之外的每個查詢的性能。 – NtscCobalt 2012-01-21 07:01:57