Postgresql CTE递归优化,如何实现?
我需要使用递归查询优化commomPostgresql CTE递归优化,如何实现?,postgresql,common-table-expression,recursive-query,Postgresql,Common Table Expression,Recursive Query,我需要使用递归查询优化commom的性能。。。我们可以限制树的深度并在许多更新中分解,还可以更改表示(使用数组)。。。我尝试了一些选择,但也许有一个“经典优化解决方案”,我没有意识到 所有细节 有一个要更新的t\u up表,其中包含一个复合主键(pk1,pk2)、一个属性attr和一组对主键的引用。。。和一个未列出的表示法t\u scan,以及参考;像这样: pk1 | pk2 | attr | ref_pk1 | ref_pk2 n | 123 | 1 | | n
的性能。。。我们可以限制树的深度并在许多更新中分解,还可以更改表示(使用数组)。。。我尝试了一些选择,但也许有一个“经典优化解决方案”,我没有意识到
所有细节
有一个要更新的t\u up
表,其中包含一个复合主键(pk1,pk2)、一个属性attr
和一组对主键的引用。。。和一个未列出的表示法t\u scan
,以及参考;像这样:
pk1 | pk2 | attr | ref_pk1 | ref_pk2
n | 123 | 1 | |
n | 456 | 2 | |
r | 123 | 1 | w | 123
w | 123 | 5 | n | 456
r | 456 | 2 | n | 123
r | 123 | 1 | n | 111
n | 111 | 4 | |
... | ...| ... | ... | ...
没有循环
UPDATE t_up SET x = pairs
FROM (
WITH RECURSIVE tree as (
SELECT pk1, pk2, attr, ref_pk1, ref_pk2,
array[array[0,0]]::bigint[] as all_refs
FROM t_scan
UNION ALL
SELECT c.pk1, c.pk2, c.attr, c.ref_pk1, c.ref_pk2
,p.all_refs || array[c.attr,c.pk2]
FROM t_scan c JOIN tree p
ON c.ref_pk1=p.pk1 AND c.ref_pk2=p.pk2 AND c.pk2!=p.pk2
AND array_length(p.all_refs,1)<5 -- 5 or 6 avoiding endless loops
)
SELECT pk1, pk2, array_agg_cat(all_refs) as pairs
FROM (
SELECT distinct pk1, pk2, all_refs
FROM tree
WHERE array_length(all_refs,1)>1 -- ignores initial array[0,0].
) t
GROUP BY 1,2
ORDER BY 1,2
) rec
WHERE rec.pk1=t_up.pk1 AND rec.pk2=t_up.pk2
;
仅运行rec
您将获得:
pk1 | pk2 | pairs
-----+-----+-----------------
r | 123 | {{0,0},{1,123}}
r | 456 | {{0,0},{2,456}}
w | 123 | {{0,0},{5,123}}
但是,不幸的是,要理解“大数据性能问题”,您需要在真实的数据库中看到它。。。我正在准备一个运行OpenStreetMap大数据的公共Github 也许可以为您的问题提供一些线索,并为相关表(包括所有索引)添加create table
语句、您正在使用的查询以及使用explain(analyze,buffers)
生成的查询。请,为了得到一个大数据解决方案,了解更多关于“真实”表的信息会有所帮助——比如索引等等。。。这些东西将在这个查询中发挥作用
pk1 | pk2 | pairs
-----+-----+-----------------
r | 123 | {{0,0},{1,123}}
r | 456 | {{0,0},{2,456}}
w | 123 | {{0,0},{5,123}}