Обсуждение: BUG #13677: CPU 100% for WITH RECURSIVE CTE Queries
The following bug has been logged on the website:
Bug reference: 13677
Logged by: Jamie Koceniak
Email address: jkoceniak@mediamath.com
PostgreSQL version: 9.1.13
Operating system: Debian GNU/Linux 7 (wheezy)
Description:
Hi,
Are there any known bugs/issues with RECURSIVE CTE Queries? We have the
classic parent/child table (with only 82K total records). The hierarchy goes
as deep as 10 levels. We turned a WITH RECURSIVE query into a view (see
below). When I perform a simple count against this view, CPU goes to 100%
for the process. Also, as more and more concurrent queries are run against
this view, there is a huge decrease in performance, every process uses 100%
CPU. The query should run in about 120ms but ends up taking several
minutes.
Here is our view definition:
View definition:
WITH RECURSIVE path AS (
SELECT a.id, a.name::text || ''::text AS path
FROM table1 a
WHERE a.parent_id IS NULL
UNION ALL
SELECT a.id, (p.path || ' - '::text) || a.name::text AS
path
FROM table1 a, path p
WHERE p.id = a.parent_id
)
SELECT a.id, p.path AS full_path, ( SELECT count(*) AS count
FROM table1 child
WHERE child.parent_id = a.id) AS child_count
FROM table1 a, path p
WHERE a.id = p.id
ORDER BY a.id;
How do we optimize a query like this? Is there a way to rewrite this query
without using recursive cte?
Thanks!
2015-10-14 4:24 GMT+02:00 <jkoceniak@mediamath.com>: > The following bug has been logged on the website: > > Bug reference: 13677 > Logged by: Jamie Koceniak > Email address: jkoceniak@mediamath.com > PostgreSQL version: 9.1.13 > Operating system: Debian GNU/Linux 7 (wheezy) > Description: > > Hi, > > Are there any known bugs/issues with RECURSIVE CTE Queries? We have the > classic parent/child table (with only 82K total records). The hierarchy > goes > as deep as 10 levels. We turned a WITH RECURSIVE query into a view (see > below). When I perform a simple count against this view, CPU goes to 100% > for the process. Also, as more and more concurrent queries are run against > this view, there is a huge decrease in performance, every process uses 100% > CPU. The query should run in about 120ms but ends up taking several > minutes. > > Here is our view definition: > View definition: > WITH RECURSIVE path AS ( > SELECT a.id, a.name::text || ''::text AS path > FROM table1 a > WHERE a.parent_id IS NULL > UNION ALL > SELECT a.id, (p.path || ' - '::text) || a.name::text AS > path > FROM table1 a, path p > WHERE p.id = a.parent_id > ) > SELECT a.id, p.path AS full_path, ( SELECT count(*) AS count > FROM table1 child > WHERE child.parent_id = a.id) AS child_count > FROM table1 a, path p > WHERE a.id = p.id > ORDER BY a.id; > > How do we optimize a query like this? Is there a way to rewrite this query > without using recursive cte? > > Thanks! > > Hi do you have necessary indexes? You can try to rewrite this query to recursive plpgsql function https://gustavostraube.wordpress.com/2009/11/17/retrieving-an-hierarchical-tree-recursively-with-plpgsql/ Regards Pavel > > > -- > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-bugs >