Re: What is the best way to do attribute/values?

From: Mark Kirkwood <markir(at)coretech(dot)co(dot)nz>
To: Josh Berkus <josh(at)agliodbs(dot)com>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: What is the best way to do attribute/values?
Date: 2004-08-26 04:51:50
Message-ID: 412D6C66.2070207@coretech.co.nz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance


Josh Berkus wrote:

>Mark, Tim,
>
>
>
>>select
>> pav1.person_id
>>from
>> person_attributes_vertical pav1
>>where
>> ( pav1.attribute_id = 1
>> and pav1.value_id in (2,3))
>> or ( pav1.attribute_id = 2
>> and pav1.value_id in (2,3))
>>
>>
>
>Not the same query, sorry. Daniel's query yields all the person_id's which
>have criteria A AND criteria B. Yours gives all the person_id's which have
>criteria A OR criteria B.
>
>
>
Apologies, not thinking clearly enough there...

Maybe try out intersection :

select
pav1.person_id
from
person_attributes_vertical pav1
where
( pav1.attribute_id = 1
and pav1.value_id in (2,3))
intersect
select
pav1.person_id
from
person_attributes_vertical pav1
where ( pav1.attribute_id = 2
and pav1.value_id in (2,3))

In the advent that is unhelpful, I wonder about simplifying the
situation and investigating how

select
pav1.person_id
from
person_attributes_vertical pav1
where
pav1.attribute_id = 1

performs, compared to

select
pav1.person_id
from
person_attributes_vertical pav1
where
( pav1.attribute_id = 1
and pav1.value_id in (2,3))

If the first performs ok and the second does not, It may be possible to
get better times by doing some horrible re-writes :e.g:

select
pav1.person_id
from
person_attributes_vertical pav1
where
( pav1.attribute_id = 1
and pav1.value_id||null in (2,3))

etc.

regards

Mark

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Dennis Bjorklund 2004-08-26 06:15:52 Re: Optimizer Selecting Incorrect Index
Previous Message Christopher Kings-Lynne 2004-08-26 01:16:17 Re: Equivalent praxis to CLUSTERED INDEX?