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

问题描述 投票:2回答:1

假设我有一个包含一些列的表和一个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使用这个索引或者我应该创建另一个?

postgresql
1个回答
2
投票

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

你可以做些什么来使用简单的索引

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

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

© www.soinside.com 2019 - 2024. All rights reserved.