From: | Thomas Kellerer <spam_eater(at)gmx(dot)net> |
---|---|
To: | pgsql-performance(at)postgresql(dot)org |
Subject: | Recursive query gets slower when adding an index |
Date: | 2012-10-19 10:47:08 |
Message-ID: | k5rb2q$42s$1@ger.gmane.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Hi,
I have a self-referencing table that defines a hierarchy of projects and sub-projects.
This is the table definition:
CREATE TABLE project
(
project_id integer primary key,
project_name text,
pl_name text,
parent_id integer
);
ALTER TABLE project
ADD CONSTRAINT project_parent_id_fkey FOREIGN KEY (parent_id)
REFERENCES project (project_id)
ON UPDATE NO ACTION
ON DELETE NO ACTION;
The table contains ~11000 rows
The following statement:
with recursive project_tree as (
select project_id,
parent_id,
pl_name as root_pl,
pl_name as sub_pl,
1 as lvl
from project
where parent_id is null
union all
select c.project_id,
c.parent_id,
coalesce(p.root_pl, c.pl_name) as root_pl,
coalesce(c.pl_name, p.sub_pl) as sub_pl,
p.lvl + 1
from project c
join project_tree p on p.project_id = c.parent_id
)
select count(*), max(lvl)
from project_tree
where root_pl <> sub_pl;
usually runs in something like 60-80ms when the parent_id column is *not* indexed.
This is the execution plan without index: http://explain.depesz.com/s/ecCT
When I create an index on parent_id execution time increases to something between 110ms and 130ms
This is the execution plan with index: http://explain.depesz.com/s/xiL
As far as I can tell, the choice for the nested loop is the reason for the (slightly) slower execution.
I increased the statistics for the parent_id column to 10000 (and did an analyze of course) but that didn't change anything.
I have no problem with that performance, so this is more a "I'm curious on why this happens" type of question.
(And I thought you might be interested in this behaviour as well)
My environment:
*Windows 7 Professional 64bit
* PostgreSQL 9.2.1, compiled by Visual C++ build 1600, 64-bit
Regards
Thomas
From | Date | Subject | |
---|---|---|---|
Next Message | Ants Aasma | 2012-10-19 12:24:46 | Re: SELECT AND AGG huge tables |
Previous Message | delongboy | 2012-10-18 22:21:22 | How to upgrade from 9.1 to 9.2 with replication? |