Sql 包含函数的查询未使用索引

Sql 包含函数的查询未使用索引,sql,postgresql,Sql,Postgresql,我有这样的疑问: SELECT f.id_foo FROM foo f WHERE date_trunc('day'::text, current_date - '597 days'::interval) > date_trunc('day'::text, f.my_date); 我想它应该是这样工作的。它正在使用一个日期索引: CREATE INDEX date_trunc_index ON foo USING btree (date_trunc('day'::text, my_dat

我有这样的疑问:

SELECT f.id_foo
FROM foo f
WHERE date_trunc('day'::text, current_date - '597 days'::interval) > date_trunc('day'::text, f.my_date);
我想它应该是这样工作的。它正在使用一个
日期索引

CREATE INDEX date_trunc_index
ON foo
USING btree
(date_trunc('day'::text, my_date));
假设这个查询在其他函数/query/view中,我想通过函数
get_days()
控制天数,该函数返回
interval

我的查询如下所示:

SELECT f.id_foo
FROM foo f
WHERE date_trunc('day'::text, current_date - get_days()) > date_trunc('day'::text, f.my_date);
我的问题是:为什么第二次查询不再使用
date\u trunc\u索引
?如何解决这个问题

编辑

解释分析

第一个问题:

"Index Scan using date_trunc_index on foo f  (cost=0.01..8.10 rows=1 width=8) (actual time=0.012..0.012 rows=0 loops=1)"
"  Index Cond: (date_trunc('day'::text, (('now'::cstring)::date - '597 days'::interval)) > date_trunc('day'::text, my_date))"
"Total runtime: 0.049 ms"
第二个问题:

"Seq Scan on foo f  (cost=0.00..4228786.45 rows=2993719 width=8) (actual time=56384.159..56384.159 rows=0 loops=1)"
"  Filter: (date_trunc('day'::text, (('now'::cstring)::date - get_days())) > date_trunc('day'::text, my_date))"
"  Rows Removed by Filter: 8980835"
"Total runtime: 56384.181 ms"

Postgres具有用于优化查询的函数的三个重要特征:不可变、稳定和易失性函数

前两个是查询单次运行期间的“常量”。这意味着优化器可以将它们视为常量。易失性函数(如
random()
)每次调用时都返回不同的值


这些都在
创建函数
中解释了
解释分析
说了什么?@icuken更新了2
解释分析
结果是
获取天数()
声明为“不可变”或“稳定”?@GordonLinoff如此明显。。。它被声明为
易失性
。将其更改为
STABLE
修复所有问题。你能把你的评论作为回答,让我接受吗。非常感谢你!