gpt4 book ai didi

postgresql - 如果将时间戳转换为日期,Postgres 是否使用索引?

转载 作者:行者123 更新时间:2023-11-29 11:46:48 25 4
gpt4 key购买 nike

假设我有一个表,其中包含一些列和 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) 上添加第二个索引。不要忘记,每个额外的索引都会消耗空间并降低数据修改语句的性能。

关于postgresql - 如果将时间戳转换为日期,Postgres 是否使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48166313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com