Sql 如何改进CTE查询?
使用Postgres 9.3.4,我能做些什么来加速这个查询吗。我正在寻找最伟大的版本,它是有向图的一部分,在本例中,一般来说,递归不是快速操作,并且有局限性,因此从提取数据的性能来看,最好预先计算可以预先计算的内容。您还可以从使用临时物理表中获益,这样您就可以在这些表上创建索引,以便更快地提取数据——不过请注意维护索引的开销。但是由于没有关于什么,在哪里,多少的真实信息,除了一般的观察之外,很难给出更多的信息。我一定忘了在临时表上设置索引。当索引位于修订版id上时,我确实可以测量性能增益,至少对于所选部件而言,填充临时表是昂贵的。我可以想象使用普通not temp表作为缓存,但需要将其与cte结合起来,因为我无法确保缓存被填充。在仍然受益于临时表索引的情况下,这是可能的吗?Sql 如何改进CTE查询?,sql,postgresql,common-table-expression,Sql,Postgresql,Common Table Expression,使用Postgres 9.3.4,我能做些什么来加速这个查询吗。我正在寻找最伟大的版本,它是有向图的一部分,在本例中,一般来说,递归不是快速操作,并且有局限性,因此从提取数据的性能来看,最好预先计算可以预先计算的内容。您还可以从使用临时物理表中获益,这样您就可以在这些表上创建索引,以便更快地提取数据——不过请注意维护索引的开销。但是由于没有关于什么,在哪里,多少的真实信息,除了一般的观察之外,很难给出更多的信息。我一定忘了在临时表上设置索引。当索引位于修订版id上时,我确实可以测量性能增益,至少
WITH RECURSIVE r(depth, revision_id) AS (
SELECT count(1) AS depth, r.revision_id AS revision_id
FROM revision AS r
WHERE r.revision_id = 300
GROUP BY r.revision_id
UNION ALL
SELECT rev1.depth + 1, rev2.parent_revision_id AS parent_revision_id
FROM rev1, revision AS rev2
WHERE rev2.revision_id != 1 AND rev2.revision_id = rev1.revision_id
)
SELECT t1.id AS id, t1.value as value
FROM (
SELECT DISTINCT ON (t2.id) t2.id AS id, t2.rev_id AS rev_id
FROM product AS t2
WHERE t2.rev_id = (
SELECT max(rev_id)
FROM product
WHERE t2.id = product.id
AND EXISTS (
SELECT 1 FROM r
WHERE r.revision_id = product.rev_id
)
) AND t2.deleted = false
) AS t1
revision
--------
revision_id, parent_revision_id
1 null
2 1
3 2
4 2
5 3
6 5
product
-------
id, rev_id, value
1 2 a
2 3 b
3 4 c
1 5 a2
1 6 a3
...
300 a256
id, value
1 a256
2 b