考虑此表,使用modified preorder tree traversal方法对某些分层树数据进行建模:
CREATE TABLE tree (
id INTEGER,
parent_id INTEGER,
tree_id INTEGER,
level INTEGER,
lft INTEGER,
rght INTEGER,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES tree(id)
);
我有一个需要获取树中所有节点的所有祖先的函数。它使用一个简单的循环与Django ORM,每行执行一次查询,花费大约10秒为3000行。
现在,这让我感到好奇 - 这可以优化得更快,使用更少的查询吗?
我首先想到的是这个单一查询:
SELECT D.id as descendant, A.id as ancestor
FROM tree as D INNER JOIN tree as A ON
(A.tree_id = D.tree_id AND A.lft < D.lft AND D.rght < A.rght);
但是,使用实际数据测量其性能表明,单个SQL查询花费的时间与3000查询方法大致相同。
我可以缓存结果,所以速度没问题。我只是想知道好奇心 - 为什么使用join
的单个查询并不比执行3000个单独查询更快?有没有什么好方法可以改进这个查询?