Re: Index problem.... GIST (tsearch2) - Mailing list pgsql-general

From Net Virtual Mailing Lists" (by way of Net Virtual Mailing Lists
Subject Re: Index problem.... GIST (tsearch2)
Date
Msg-id 20041007225518.19837@mail.net-virtual.com
Whole thread Raw
In response to Index problem.... GIST (tsearch2)  ("Net Virtual Mailing Lists" <mailinglists@net-virtual.com>)
Responses Re: Index problem.... GIST (tsearch2)  (Greg Stark <gsstark@mit.edu>)
List pgsql-general
Than you very much Andrew...

Yes you are right.. I mis-typeed CREATE INDEX.. ;-)

The actual create indexes are as you suggested:

CREATE INDEX sometable_category1_idx ON sometable (is_null(category1));
CREATE INDEX sometable_category2_idx ON sometable (is_null(category2));
CREATE INDEX sometable_category3_idx ON sometable (is_null(category3));


In an effort to simplify the problem, I was indicating the columns are
integers.. They are, in fact, ltree and everytime I did a "SELECT * from
sometable WHERE category1 IS NOT NULL", it shows that it does a
sequential scan.. Thats the reason I created the is_null function
(perhaps that was a bad idea, but I just could not make it work)...

Regardless, it still won't use my is_null index first, any way around that?..

- Greg

>Hi:
>
>> CREATE OR REPLACE FUNCTION is_null(anyelement) RETURNS BOOLEAN AS 'SELECT
>> $1 IS NULL;' LANGUAGE 'SQL' IMMUTABLE;
>> CREATE FUNCTION sometable_category1_idx ON sometable (category1);
>> CREATE FUNCTION sometable_category2_idx ON sometable (category2);
>> CREATE FUNCTION sometable_category3_idx ON sometable (category3);
>>
>
>Alright ... there's something whacky here.  I think you meant to use CREATE
>INDEX?  Is that right?
>
>CREATE INDEX sometable_category1_idx ON sometable (category1);
>
>> When I do a query like this though it is slow because it insists on doing
>> the full-text index first:
>>
>> SELECT * from sometable WHERE is_null(category1)='f' AND data_fti @@
>> to_tsquery('default', 'postgres');
>>
>>
>> How can I make this query first use the is_null index?... It strikes me
>> that this would almost always be faster then doing the full-text search
>> first, right?...
>>
>
>
>It looks to me like there are better ways to accomplish what you are doing.
>
>Your indexes have indexed the value of the column ... not the value of your
>function is_null(column).  Which you could also do like this:
>
>CREATE INDEX sometable_category1_idx ON sometable (is_null(category1));
>
>That would probably speed up the second query ... but I think that would be
>slower than leaving an index on the INTEGER value and writing the query like
>this:
>
>SELECT * from sometable WHERE category1 IS NOT NULL
> AND data_fti @@ to_tsquery('default', 'postgres');
>
>Why bother to write a function when what you want is supported right in
SQL?
>Avoids a function call.  You might want to think about exactly what you want
>to index ... indexes can be costly if not used on frequent access columns.
>
>
>
>HTH,
>
>
>Andy
>



pgsql-general by date:

Previous
From: "Net Virtual Mailing Lists"
Date:
Subject: Index problem.... GIST (tsearch2)
Next
From: Robby Russell
Date:
Subject: Re: 8.0 questions