How are working index with date ?

Поиск
Список
Период
Сортировка
От Hervé Piedvache
Тема How are working index with date ?
Дата
Msg-id 3BFCE82D.5559BCF8@elma.fr
обсуждение исходный текст
Ответы Re: How are working index with date ?  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
Список pgsql-sql
Hi,

I have some questions about date format and index ..

I have a simple table with 1 million records, only insert about 1000
insert by day ...

The Struct of this table is :
create table mylog (part text, id text, datelog timestamp);

I created two index for my test :
create index ix_datelog on mylog (datelog);
or
create index ix_datelog2 on mylog (date(datelog));

If I do a simple :
select * from mylog order by datelog desc limit 5;

The answer is immediate ... OK I understand that postgresql do not need
to make an order after the extraction because the optimizer think that
it's quicker to read the data from the index then read all the data
sequencialy and making the order by in RAM after (so slow) ...

But I tried several requests that never use my index :

select part, count(id) from mylogwhere date_part('month',datelog)=date_part('month',timestamp 'now')  and
date_part('year',datelog)=date_part('year',timestamp'now')group by part;
 

select part, count(id) from mylogwhere extract(month from datelog)=extract(month from timestamp 'now')  and
extract(yearfrom datelog)=extract(year from timestamp 'now')group by part;
 

select part, count(id) from mylogwhere to_char(datelog,'YYYY/MM')=to_char(now(),'YYYY/MM')group by part;

I accept the way that the index is not used because I modify two times
the left sentence of the WHERE.

So I have to declare the month and the year in constant mode like that :

select part, count(id) from mylog where datelog between '2001-11-01' and '2001-11-30' group by part;

but I have to find the last day of the month ... or the first day of the
next month to do :

select part, count(id) from mylog where datelog>='2001-11-01' and datelog<'2001-12-01' group by part;

Like that I use my index ...

BUT ... yes again ;)

For this case ... I don use my index ...

select part, count(id) from mylogwhere date(datelog)=date('now')-1group by part

and also not like this :

select part, count(id) from mylog where date(datelog)=date('yesterday') group by part

I win some cost in the explain ... but I never use any index ...

So does this index is usefull or not ... ?
I make many statistics with date ... and I'm really disapointed !!

Thanks for your reply !

Sorry for my poor english ... ;)

regards,
-- 
Hervé


В списке pgsql-sql по дате отправления:

Предыдущее
От: MindTerm
Дата:
Сообщение: Re: Porting Oracle Decode to Postgresql
Следующее
От: "Koen Antonissen"
Дата:
Сообщение: "posttime" time DEFAULT now()