Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Postgres use indexes if casting timestamp to date?

Tags:

postgresql

Let's say I have a table with some columns and a column dt which is of type TIMESTAMP.

I create a (non functional) index on this column.

Then I execute a query

SELECT *
FROM tbl
WHERE
    dt::DATE = NOW()::DATE

The question is will Postgres use the index I've created earlier and under which circumstances it will/will not?

I understand that a functional index would cover this case, but does a simple index cover both cases or not when it's a TIMESTAMP -> DATE type conversion?

EDIT:

performing an EXPLAIN ANALYZE on the query tells us it does not use index and performs a Seq scan (table with 3+ mil records:

Seq Scan on tbl  (cost=0.00..192289.92 rows=17043 width=12) (actual time=7.237..2493.496 rows=4928 loops=1)
  Filter: ((dt)::date = (now())::date)
  Rows Removed by Filter: 3397155
Total runtime: 2494.546 ms

Let me ask a question differently then, is it possible to make Postgres utilize this index or should I create another one?

like image 669
Sergey Telshevsky Avatar asked Oct 22 '25 16:10

Sergey Telshevsky


1 Answers

A simple index will not work in this case; try it with EXPLAIN.

What you could do to use the simple index is

WHERE dt >= current_date::timestamptz
  AND dt < (current_date + 1)::timestamptz

I think that this is pretty readable and the best solution, but if you want to go with your current query, you'll have to add a second index on (dt::date). Don't forget that every additional index costs space and slows down the performance of data modifying statements.

like image 114
Laurenz Albe Avatar answered Oct 25 '25 11:10

Laurenz Albe