gpt4 book ai didi

sql - 内部函数查询不使用索引

转载 作者:行者123 更新时间:2023-11-29 12:18:30 24 4
gpt4 key购买 nike

我有这样的查询:

SELECT f.id_foo
FROM foo f
WHERE date_trunc('day'::text, current_date - '597 days'::interval) > date_trunc('day'::text, f.my_date);

它正在按照我的预期运行。它正在使用 date_trunc_index:

CREATE INDEX date_trunc_index
ON foo
USING btree
(date_trunc('day'::text, my_date));

假设此查询在其他函数/查询/ 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_trunc_index?以及如何解决这个问题?

编辑

EXPLAIN ANALYZE 用于:

第一个查询:

"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())每次调用时都会返回不同的值。

这些在 create 函数中有解释 documentation .

关于sql - 内部函数查询不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39974984/

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