假设我有一个包含一些列的表和一个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使用这个索引或者我应该创建另一个?
在这种情况下,简单的索引不起作用;尝试用EXPLAIN
。
你可以做些什么来使用简单的索引
WHERE dt >= current_date::timestamptz
AND dt < (current_date + 1)::timestamptz
我认为这是非常易读且最好的解决方案,但是如果你想使用当前的查询,你将不得不在(dt::date)
上添加第二个索引。不要忘记,每个额外的索引都会占用空间并降低数据修改语句的性能。