如何为 DESC NULLS LAST 排序正确创建索引

Bob*_*Bob 6 postgresql indexing

我创建了一个索引而不指定排序或空值 first/last 例如:

CREATE INDEX index_name ON TABLE table_name (date)
Run Code Online (Sandbox Code Playgroud)

现在我的ORDER BY DESC NULLS LAST查询运行非常缓慢。

我在 PostgreSQL 文档中读到,

NULLS FIRST 指定空值排在非空值之前。这是指定 DESC 时的默认设置。

NULLS LAST 指定空值排在非空值之后。这是未指定 DESC 时的默认设置。

因此,如果我创建这样的索引(对于 col date):

CREATE INDEX index_name ON TABLE table_name (date DESC NULLS LAST)
Run Code Online (Sandbox Code Playgroud)

对于诸如此类的查询,我会获得严重的性能提升吗

SELECT * FROM table_name ORDER BY date DESC NULLS LAST LIMIT 50 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

?

pol*_*iro 5

来自 postgres 9.6文档

如果您需要在依赖索引以避免排序步骤的查询中支持“空值排序低”行为而不是默认的“空值排序高”行为,则 NULLS 选项很有用。

如果您没有在索引上提供 NULLS LAST,查询计划器很可能需要在返回记录之前对记录进行排序,如果表包含足够的记录,这可能会导致性能大幅下降。