Thread: FK Constraints, indexes and performance

FK Constraints, indexes and performance

From
ow
Date:
Pg 7.3.3 on i386 compiled by GCC 2.96

Hi,

It's understood that FK constraints carry some performance hit. However, the
performance hit I observe is huge. My situation is illustrated by the table
structures below.

Parent table has 20,000 rows and Child table has about 60,000.

Without fk_child_parentid constraint, it takes about 9 seconds to insert 10,000
records into the Child table. WITH fk_child_parentid constraint, it takes about
300 (!) seconds to insert the same 10,000 into the Child table.

The reason for such poor performace with the fk_child_parentid constraint is
the fact that, I think, when verifying the fk_child_parentid constraint, PG is
doing sequential scan of the Parent table instead of the using the implicit
index created by the pk_parent constraint. 10000 sequential scans against 20000
row table really take a hit on performance.

The reason I think PG is doing sequential scans is because the execution plan
for the following query shows two sequential scans:
explain select *
from parent, child
where child.parentId = parent.id

With reference to the above, two (2) questions:

1) Is there anything that can be done to significantly improve Child insert
performance when fk_child_parentid is in place?

2) Why wouldn't PG use implicit index pk_parent when resolving
"where C.parentId =P.id" in the query above.

Thanks


------------------------------------ Test table structures
Domains
test.did = int
test.dname = varchar(30)
test.dstringlong = varchar(50)

CREATE TABLE test.parent
( id test.did NOT NULL, name test.dname NOT NULL, CONSTRAINT pk_parent PRIMARY KEY (id), CONSTRAINT ak_parent_name
UNIQUE(name)
 
) WITH OIDS;

CREATE TABLE test.child
( id test.didlong NOT NULL, parentid test.did NOT NULL, name test.dstringlong NOT NULL, CONSTRAINT pk_child PRIMARY KEY
(id),CONSTRAINT fk_child_parentid FOREIGN KEY (parentid) REFERENCES test.parent
 
(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
) WITH OIDS;






__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com


Re: FK Constraints, indexes and performance

From
Tom Lane
Date:
ow <oneway_111@yahoo.com> writes:
> It's understood that FK constraints carry some performance hit. However, the
> performance hit I observe is huge.

It looks to me like the 7.3 planner will not choose indexscans for the FK
check queries in this example, because the comparison operators are
misconstrued as shown in this thread:
http://archives.postgresql.org/pgsql-hackers/2003-03/msg00997.php
The equality operator on your domain is taken to be "oideq" which won't
be the same operator associated with the index on the column.

This seems to be fixed in 7.4.  In 7.3 I'd counsel not introducing
domains unnecessarily.
        regards, tom lane


Re: FK Constraints, indexes and performance

From
Peter Childs
Date:
On Monday 06 October 2003 01:29, ow wrote:
> Pg 7.3.3 on i386 compiled by GCC 2.96
>
> Hi,
>
> It's understood that FK constraints carry some performance hit. However,
> the performance hit I observe is huge. My situation is illustrated by the
> table structures below.
>
> Parent table has 20,000 rows and Child table has about 60,000.
>
> Without fk_child_parentid constraint, it takes about 9 seconds to insert
> 10,000 records into the Child table. WITH fk_child_parentid constraint, it
> takes about 300 (!) seconds to insert the same 10,000 into the Child table.
>
> The reason for such poor performace with the fk_child_parentid constraint
> is the fact that, I think, when verifying the fk_child_parentid constraint,
> PG is doing sequential scan of the Parent table instead of the using the
> implicit index created by the pk_parent constraint. 10000 sequential scans
> against 20000 row table really take a hit on performance.
Forget the idea that there is an index unless you put one on your self. This 
is because on a relly small parent table a sequencal scan can be faster than 
a index scan and hence be pointless. esspecally if the table needs updating 
regularly. So create an index on any relevent fields. Analyse the tables. and see if you 
get any improvements. You can always remove the indexes again if they don't 
help.There was talk some time ago of keeping stats on foriegn keys so that they 
could be used for an extra preformace gain. but a think that may have got on 
the todo list.

Peter Childs

>
> The reason I think PG is doing sequential scans is because the execution
> plan for the following query shows two sequential scans:
> explain select *
> from parent, child
> where child.parentId = parent.id
>
> With reference to the above, two (2) questions:
>
> 1) Is there anything that can be done to significantly improve Child insert
> performance when fk_child_parentid is in place?
>
> 2) Why wouldn't PG use implicit index pk_parent when resolving
> "where C.parentId =P.id" in the query above.
>
> Thanks
>
>
> ------------------------------------ Test table structures
> Domains
> test.did = int
> test.dname = varchar(30)
> test.dstringlong = varchar(50)
>
> CREATE TABLE test.parent
> (
>   id test.did NOT NULL,
>   name test.dname NOT NULL,
>   CONSTRAINT pk_parent PRIMARY KEY (id),
>   CONSTRAINT ak_parent_name UNIQUE (name)
> ) WITH OIDS;
>
> CREATE TABLE test.child
> (
>   id test.didlong NOT NULL,
>   parentid test.did NOT NULL,
>   name test.dstringlong NOT NULL,
>   CONSTRAINT pk_child PRIMARY KEY (id),
>   CONSTRAINT fk_child_parentid FOREIGN KEY (parentid) REFERENCES
> test.parent (id) ON UPDATE RESTRICT ON DELETE RESTRICT,
> ) WITH OIDS;
>
>
>
>
>
>
> __________________________________
> Do you Yahoo!?
> The New Yahoo! Shopping - with improved product search
> http://shopping.yahoo.com
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faqs/FAQ.html



Re: FK Constraints, indexes and performance

From
ow
Date:
--- Tom Lane <tgl@sss.pgh.pa.us> wrote:
> It looks to me like the 7.3 planner will not choose indexscans for the FK
> check queries in this example, because the comparison operators are
> misconstrued as shown in this thread:
> http://archives.postgresql.org/pgsql-hackers/2003-03/msg00997.php
> The equality operator on your domain is taken to be "oideq" which won't
> be the same operator associated with the index on the column.
> 
> This seems to be fixed in 7.4.  In 7.3 I'd counsel not introducing
> domains unnecessarily.
> 
>             regards, tom lane

It looks like it worked. I moved to 7.4.b4 and, in my case, performance
improvement on insert is drastic (about 30x). Thanks






__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com