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
修复所有问题。你能把你的评论作为回答,让我接受吗。非常感谢你!