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 |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-admin pgsql-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
<>
From | Date | Subject | |
---|---|---|---|
Next Message | Stephan Szabo | 2003-09-18 15:02:26 | Re: Postgresql UPDATE LOCKS unrelated rows. |
Previous Message | Geoff Ellis | 2003-09-18 13:41:09 | Testing for a record before update or insert without using a function. |
From | Date | Subject | |
---|---|---|---|
Next Message | Christopher Kings-Lynne | 2003-09-18 14:47:03 | Re: Is there a reason _not_ to vacuum continuously? |
Previous Message | Oliver Scheit | 2003-09-18 09:29:23 | Re: Is there a reason _not_ to vacuum continuously? |