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