如果将时间戳转换为日期,Postgres会使用索引吗?

时间:2018-01-09 10:39:43

标签: postgresql

假设我有一个包含某些列的表格以及dt类型的TIMESTAMP列。

我在这个列上创建了一个(非功能)索引。

然后我执行查询

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

问题是Postgres会使用我之前创建的索引,在哪种情况下它会/不会?

我理解功能索引会覆盖这种情况,但当一个TIMESTAMP - >时,一个简单的索引会覆盖两种情况。 DATE类型转换?

编辑:

在查询上执行EXPLAIN ANALYZE告诉我们它不使用索引并执行Seq扫描(包含3 + mil记录的表格:

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

让我以不同的方式提出一个问题,是否可以让Postgres使用这个索引,还是应该创建另一个?

1 个答案:

答案 0 :(得分:2)

在这种情况下,简单的索引不起作用;试试EXPLAIN

使用简单索引可以做什么

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

我认为这是非常易读且最好的解决方案,但如果您想使用当前查询,则必须在(dt::date)上添加第二个索引。 不要忘记每个额外的索引都会占用空间并降低数据修改语句的性能。