Skip site navigation (1) Skip section navigation (2)

Re: [PERFORM] How to force an Index ?

From: Rhaoni Chiu Pereira <rhaoni(at)sistemica(dot)info>
To: josh(at)agliodbs(dot)com
Cc: PostgreSQL ADMIN <pgsql-admin(at)postgresql(dot)org>,PostgreSQL Performance <pgsql-performance(at)postgresql(dot)org>
Subject: Re: [PERFORM] How to force an Index ?
Date: 2003-09-18 14:45:09
Message-ID: 1063896309.3f69c4f5cd16a@sistemica.info (view raw or flat)
Thread:
Lists: pgsql-adminpgsql-performance
I solve this problem doing this:

 create function date_to_yyyymm( timestamp ) returns gsames00.ano_mes%type as
 'select to_char($1, ''YYYYMM'');
 ' language sql immutable strict;

And changing the SQL where clause:

 ... gsames00.ano_mes = to_char(ftnfco00.data_emissao,'YYYYMM') AND ...

to:

 ... gsames00.ano_mes = date_to_yyyymm(ftnfco00.data_emissao) AND ...

   Then it uses the gsames00 index instead of a SeqScan 'cuz it is camparing
same data type, but .. I don't want to create this function 'cuz this aplication
is used with Oracle too. 
I need to know if there is a way to set the to_char output to varchar instead of
text !
  Any Idea ? So, this way I wont have to change my aplication source.



Atenciosamente,

Rhaoni Chiu Pereira
Sistêmica Computadores

Visite-nos na Web: http://sistemica.info
Fone/Fax : +55 51 3328 1122



Citando Josh Berkus <josh(at)agliodbs(dot)com>:

<> Rhaoni,
<> 
<> First off, thanks for posting such complete info.
<> 
<> >    ... gsames00.ano_mes = to_char(ftnfco00.data_emissao,'YYYYMM') AND ...
<> > 
<> >    ftnfco00.data_emissao is a timestamp. When I run the explain analyze it
<> 
<> says:
<> > 
<> > ...
<> >  ->  Seq Scan on gsames00  (cost=100000000.00..100000006.72 rows=372 
<> width=10) 
<> > (actual time=0.01..0.96 rows=372 loops=19923)
<> > ...
<> 
<> Your problem is that you're comparing against a calculated expression based
<> on 
<> ftnfco00, which is being filtered in about 18 other ways.  As a result, the
<> 
<> planner doesn't know what to estimate (see the cost estimate of 100000000, 
<> which is a "blind guess" values) and goes for a seq scan.
<> 
<>  Can I ask you to try this workaround, to create an expressional index on 
<> ftnfco00 (assuming that data_emmisao is of type DATE)
<> 
<> create function date_to_yyyymm( date ) returns text as
<> 'select to_char($1, ''YYYYMM'');
<> ' language sql immutable strict;
<> 
<> create index idx_data_yyyymm on ftnfco00(date_to_yyyymm(data_emmisao));
<> 
<> -- 
<> -Josh Berkus
<>  Aglio Database Solutions
<>  San Francisco
<> 
<> 
<> ---------------------------(end of broadcast)---------------------------
<> TIP 4: Don't 'kill -9' the postmaster
<> 


In response to

Responses

pgsql-performance by date

Next:From: Christopher Kings-LynneDate: 2003-09-18 14:47:03
Subject: Re: Is there a reason _not_ to vacuum continuously?
Previous:From: Oliver ScheitDate: 2003-09-18 09:29:23
Subject: Re: Is there a reason _not_ to vacuum continuously?

pgsql-admin by date

Next:From: Stephan SzaboDate: 2003-09-18 15:02:26
Subject: Re: Postgresql UPDATE LOCKS unrelated rows.
Previous:From: Geoff EllisDate: 2003-09-18 13:41:09
Subject: Testing for a record before update or insert without using a function.

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group