目前,我有一个分级数据关闭表,有500万分点,导致关闭表上约7 500万分。 由于关闭表的尺寸,利用SqLite 我的询问时间正在成指数上升。
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分钟后,如果 no子是根基并修改了<条码>,则Im 储存一个毛子。 我对重复数据并不感到非常高兴,但我的问答时间目前是每个问询单位数毫米秒。
我也有许多问询,需要了解某一 no子的多少后代(主要是如果 Des子和gt子;1)知道该目标是否能够在树眼中实现虚拟化/扩大。 我每次都问这个问题,但是,在像我这样具有指数的巨型数据库中,问询似乎要长(超过1秒),因此,我也将其减到<条码>第条码>。 令人不舒服的是我想要避免的另一个重复数据。
我使用的询问如下。 如果任何人能够解释如何提高这一业绩(我认为我已经有了从Ancestor开始的指数),我将不胜感谢。
SELECT COUNT(*) FROM `Closure` WHERE `Ancestor`=@Node