Partitions and indexes

Started by Amitabh Kantabout 15 years ago7 messagesgeneral
Jump to latest
#1Amitabh Kant
amitabhkant@gmail.com

Hello

If I have partitioned a table based on a foreign key in a manner where every
child table will only have data for single value of the foreign key, do I
need to create a index for the foreign key in the primary and/or child
tables? I am using version 8.4

With regards

Amitabh

#2Amitabh Kant
amitabhkant@gmail.com
In reply to: Amitabh Kant (#1)
Re: Partitions and indexes

On Fri, Feb 25, 2011 at 1:17 PM, Chetan Suttraway <
chetan.suttraway@enterprisedb.com> wrote:

On Wed, Feb 23, 2011 at 12:52 PM, Amitabh Kant <amitabhkant@gmail.com>wrote:

Hello

If I have partitioned a table based on a foreign key in a manner where
every child table will only have data for single value of the foreign key,
do I need to create a index for the foreign key in the primary and/or child
tables? I am using version 8.4

With regards

Amitabh

Could you post a detailed set of queries?

--
Chetan Sutrave
http://www.enterprisedb.com

A simplified representation would be:

Table T1
id int (PK)
name varchar
--
--

Table T2
id int (PK)
T1id int (FK to T1->id)
--
--

Now if I partition the table T2 based on field T1id, making sure that each
distinct T1id is provided its own child table

Table T2C1 (inherited from T2, T1id field only contains 1 for all rows)
Table T2C2 (inherited from T2, T1id field only contains 2 for all rows)
--
--

What I would like to know here is that do I need to add an index for T1id
field for either T2 or it's inherited tables (T2C1/T2C2 etc)?

Amitabh

#3Alban Hertroys
dalroi@solfertje.student.utwente.nl
In reply to: Amitabh Kant (#2)
Re: Partitions and indexes

On 26 Feb 2011, at 18:04, Amitabh Kant wrote:

Now if I partition the table T2 based on field T1id, making sure that each distinct T1id is provided its own child table

Table T2C1 (inherited from T2, T1id field only contains 1 for all rows)
Table T2C2 (inherited from T2, T1id field only contains 2 for all rows)
--
--

What I would like to know here is that do I need to add an index for T1id field for either T2 or it's inherited tables (T2C1/T2C2 etc)?

No. Either would be rather pointless. In the child tables all the values in that index would have the same exact value, which you don't need as constraint exclusion already pointed the planner to the right table. In the parent table there wouldn't be any data to index.

Alban Hertroys

--
If you can't see the forest for the trees,
cut the trees and you'll see there is no forest.

!DSPAM:737,4d69400211732483184779!

#4John R Pierce
pierce@hogranch.com
In reply to: Alban Hertroys (#3)
Re: Partitions and indexes

On 02/26/11 10:01 AM, Alban Hertroys wrote:

On 26 Feb 2011, at 18:04, Amitabh Kant wrote:

Now if I partition the table T2 based on field T1id, making sure that each distinct T1id is provided its own child table

Table T2C1 (inherited from T2, T1id field only contains 1 for all rows)
Table T2C2 (inherited from T2, T1id field only contains 2 for all rows)
--
--

What I would like to know here is that do I need to add an index for T1id field for either T2 or it's inherited tables (T2C1/T2C2 etc)?

No. Either would be rather pointless. In the child tables all the values in that index would have the same exact value, which you don't need as constraint exclusion already pointed the planner to the right table. In the parent table there wouldn't be any data to index.

the whole idea of one table per row sounds rather odd and pointless to me.

#5Amitabh Kant
amitabhkant@gmail.com
In reply to: John R Pierce (#4)
Re: Partitions and indexes

On Sat, Feb 26, 2011 at 11:52 PM, John R Pierce <pierce@hogranch.com> wrote:

On 02/26/11 10:01 AM, Alban Hertroys wrote:

On 26 Feb 2011, at 18:04, Amitabh Kant wrote:

Now if I partition the table T2 based on field T1id, making sure that

each distinct T1id is provided its own child table

Table T2C1 (inherited from T2, T1id field only contains 1 for all rows)
Table T2C2 (inherited from T2, T1id field only contains 2 for all rows)
--
--

What I would like to know here is that do I need to add an index for T1id
field for either T2 or it's inherited tables (T2C1/T2C2 etc)?

No. Either would be rather pointless. In the child tables all the values
in that index would have the same exact value, which you don't need as
constraint exclusion already pointed the planner to the right table. In the
parent table there wouldn't be any data to index.

the whole idea of one table per row sounds rather odd and pointless to me.

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Not sure I am getting you correctly, but every table will have multiple rows
of data, but for every row in a given table, the value of the FK would be
the same.

Amitabh

#6John R Pierce
pierce@hogranch.com
In reply to: Amitabh Kant (#5)
Re: Partitions and indexes

On 02/26/11 10:42 AM, Amitabh Kant wrote:

On Sat, Feb 26, 2011 at 11:52 PM, John R Pierce <pierce@hogranch.com
<mailto:pierce@hogranch.com>> wrote:

On 02/26/11 10:01 AM, Alban Hertroys wrote:

On 26 Feb 2011, at 18:04, Amitabh Kant wrote:

Now if I partition the table T2 based on field T1id,
making sure that each distinct T1id is provided its own
child table

Table T2C1 (inherited from T2, T1id field only contains 1
for all rows)
Table T2C2 (inherited from T2, T1id field only contains 2
for all rows)
--
--

What I would like to know here is that do I need to add an
index for T1id field for either T2 or it's inherited
tables (T2C1/T2C2 etc)?

No. Either would be rather pointless. In the child tables all
the values in that index would have the same exact value,
which you don't need as constraint exclusion already pointed
the planner to the right table. In the parent table there
wouldn't be any data to index.

the whole idea of one table per row sounds rather odd and
pointless to me.<http://www.postgresql.org/mailpref/pgsql-general&gt;

Not sure I am getting you correctly, but every table will have
multiple rows of data, but for every row in a given table, the value
of the FK would be the same.

ah, I misunderstood the original description.

you're not likely to query T2 by T1id, are you? Doing so would return
all of one of those inherited tables

#7Amitabh Kant
amitabhkant@gmail.com
In reply to: John R Pierce (#6)
Re: Partitions and indexes

On Sun, Feb 27, 2011 at 12:30 AM, John R Pierce <pierce@hogranch.com> wrote:

On 02/26/11 10:42 AM, Amitabh Kant wrote:

On Sat, Feb 26, 2011 at 11:52 PM, John R Pierce <pierce@hogranch.com<mailto:
pierce@hogranch.com>> wrote:

On 02/26/11 10:01 AM, Alban Hertroys wrote:

On 26 Feb 2011, at 18:04, Amitabh Kant wrote:

Now if I partition the table T2 based on field T1id,
making sure that each distinct T1id is provided its own
child table

Table T2C1 (inherited from T2, T1id field only contains 1
for all rows)
Table T2C2 (inherited from T2, T1id field only contains 2
for all rows)
-- --

What I would like to know here is that do I need to add an
index for T1id field for either T2 or it's inherited
tables (T2C1/T2C2 etc)?

No. Either would be rather pointless. In the child tables all
the values in that index would have the same exact value,
which you don't need as constraint exclusion already pointed
the planner to the right table. In the parent table there
wouldn't be any data to index.

the whole idea of one table per row sounds rather odd and
pointless to me.<http://www.postgresql.org/mailpref/pgsql-general&gt;

Not sure I am getting you correctly, but every table will have multiple
rows of data, but for every row in a given table, the value of the FK would
be the same.

ah, I misunderstood the original description.

you're not likely to query T2 by T1id, are you? Doing so would return all
of one of those inherited tables

Almost all queries will have T1id as one of its parameter, although not the
only parameter.

Amitabh