不考虑 Postgres 部分索引

Mar*_*mon 2 postgresql indexing

我有一个大约有 2 亿行的表。在那张桌子上,我有一个标志deprecated(布尔值)和一个date_time(时间戳)。

我的表中充满了已弃用的值。目前,我有 2 亿的 3 个值尚未弃用。

所以我尝试在已弃用的标志上添加部分索引,但 postgres 没有考虑它并继续进行 Seq 扫描。

以下是索引的创建方式:

CREATE INDEX api_kpi_date_time_idx ON public.api_kpi USING btree (date_time) WHERE (deprecated = false)
Run Code Online (Sandbox Code Playgroud)

我尝试运行解释:

explain select ak.id from api_kpi ak
where ak.deprecated is false and date_time < now() 
Run Code Online (Sandbox Code Playgroud)

我得到以下信息:

Seq Scan on api_kpi ak  (cost=0.00..10208288.72 rows=80594624 width=37)
  Filter: ((deprecated IS FALSE) AND (date_time < now()))
Run Code Online (Sandbox Code Playgroud)

查询运行大约需要 5 分钟。

我需要做什么才能确保 Postgres 考虑索引并且仅对索引中的子集进行日期比较?

Mar*_*mon 5

执行查询后发现错误。

deprecated IS FALSE!= deprecated = FALSE。创建部分索引时,查询必须与 Postgres 完全相同才能获取它。