Re: [PERFORM] How to force an Index ?
От | Rhaoni Chiu Pereira |
---|---|
Тема | Re: [PERFORM] How to force an Index ? |
Дата | |
Msg-id | 1063896309.3f69c4f5cd16a@sistemica.info обсуждение исходный текст |
Ответы |
Re: [PERFORM] How to force an Index ?
Re: [PERFORM] How to force an Index ? |
Список | pgsql-admin |
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@agliodbs.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 <>
В списке pgsql-admin по дате отправления: