Postgresql 空值上的非选择性部分索引

Postgresql 空值上的非选择性部分索引,postgresql,indexing,query-optimization,postgresql-9.3,partial-index,Postgresql,Indexing,Query Optimization,Postgresql 9.3,Partial Index,我刚刚在数据库中发现了一个有趣的部分索引: CREATE INDEX orders_idx ON orders USING btree (status) WHERE status IS NULL; 正如您所看到的,它是完全非选择性的,并且完全没有用处,或者我遗漏了什么吗?如果您有按状态筛选为空的查询(如注释中所述),或者需要对状态为空的条目运行维护,则此索引可能很有用 例如,在我曾经处理的一个项目(没有这种类型的索引)中,我有一个保存日志/队列的导入过程。它在启动时将状态设置为

我刚刚在数据库中发现了一个有趣的部分索引:

CREATE INDEX orders_idx
  ON orders
  USING btree
  (status)
  WHERE status IS NULL;

正如您所看到的,它是完全非选择性的,并且完全没有用处,或者我遗漏了什么吗?

如果您有按状态筛选为空的查询(如注释中所述),或者需要对状态为空的条目运行维护,则此索引可能很有用


例如,在我曾经处理的一个项目(没有这种类型的索引)中,我有一个保存日志/队列的导入过程。它在启动时将状态设置为“排队”,在进行中将状态设置为“运行”,在完成时将状态设置为“完成”——但如果出现错误,则将其设置为null。这需要清理,因为其他表中的项没有正确设置为所需的值。我需要定期查询status is null来诊断特定的问题,或者运行清理脚本,这样数据库就不会充满部分导入。

取决于status列中有多少行
null
。如果只有少数,这可能对状态为null的
条件很有帮助。@where条件
状态为null的\u horse\u与\u no\u name:应作为答案通过。另外:如果所有需要索引
状态的查询都具有where条件
状态为null的
,该索引即使对于大量空值也很有用,只要它不是绝大多数行的索引。status列中的空值数量正在减少。我需要对它进行更多的测试。谢谢你的回答。是的,我的情况也一样。我想知道在这种情况下,索引维护与搜索成本相比是否太贵。我认为这是你需要分析的东西。在我们的例子中,我认为最好为索引维护提供固定的开销,以减少在我们进行清理时遇到的非常沉重的负载,否则会破坏其他方面。(在某些方面,这不是一个伟大的系统。)