Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有WHERE的PostgreSQL查询只有ORDER BY和LIMIT不使用索引_Sql_Postgresql - Fatal编程技术网

没有WHERE的PostgreSQL查询只有ORDER BY和LIMIT不使用索引

没有WHERE的PostgreSQL查询只有ORDER BY和LIMIT不使用索引,sql,postgresql,Sql,Postgresql,我有一个包含BIGSERIAL类型的“id”列的表。我还有一个索引,用于这个单列排序顺序的降序,BTREE,unique 我经常需要从一个包含数百万条目的表中检索最后10条、20条、30条,如下所示: SELECT * FROM table ORDER BY id DESC LIMIT 10 我认为这是一个非常明显的例子:这个特定字段有一个索引,排序顺序匹配,我只需要10个条目,而整个表中有数百万个条目,这个查询肯定使用索引扫描 但是它没有,它对整个桌子进行顺序扫描 我试着深入挖掘,没有发现任

我有一个包含BIGSERIAL类型的“id”列的表。我还有一个索引,用于这个单列排序顺序的降序,BTREE,unique

我经常需要从一个包含数百万条目的表中检索最后10条、20条、30条,如下所示:

SELECT * FROM table ORDER BY id DESC LIMIT 10
我认为这是一个非常明显的例子:这个特定字段有一个索引,排序顺序匹配,我只需要10个条目,而整个表中有数百万个条目,这个查询肯定使用索引扫描

但是它没有,它对整个桌子进行顺序扫描

我试着深入挖掘,没有发现任何异常。博士后博士说:

一个重要的特例是ORDER BY与极限n:An的组合 显式排序必须处理所有数据以识别第一个 n行,但如果存在与ORDER BY匹配的索引,则前n行 可以直接检索行,而无需扫描其余的行


但它仍然不起作用。有人给我指点什么吗?也许我再也看不到森林里的福勒斯特了-

如果您需要获取表中的最后10个条目,可以使用:

SELECT * 
FROM table 
WHERE id >= (SELECT MAX(id) FROM table) - 10 
ORDER BY id DESC
同样地,20和30个条目也是如此。
这看起来不太清楚,但只要你有“id”列的索引,它就会运行得很快。

好的,大声说出来,并试图收集更多的信息来加入我的问题显然让我再次看到了forrest,我发现了实际的问题。在我上面提到的文件中,下面是这句话:

以升序存储且先为空的索引可以满足以下任一条件: 先按x ASC空值排序或最后按x DESC空值排序取决于 扫描的方向

这就是问题所在。我在索引中指定了排序顺序,但我先忽略了空值,后忽略了空值

如果在查询中没有明确提及,则Postgres默认值首先为空。所以Postgres首先发现的是DESC NULLS的组合顺序,这在我的索引中没有涉及。排序顺序和空值的组合才是最重要的

两种可能的解决方案:

或者在查询中相应地首先/最后提及null,以便它与索引匹配 …或者先将索引更改为null,这就是我所做的
现在,Postgres正在进行适当的索引扫描,在查询过程中只涉及10个元素,而不是所有元素。

请回答您的问题,并为所涉及的表添加create table语句,包括所有索引和使用explain ANALYSE、buffers生成的表。请不要只是简单的解释,您是否尝试过从表中选择*,其中id在select id from table order by id desc limit中10@a_horse_with_no_name当前位置我发现了我的问题,并在下面发布了答案。谢谢你的提示和额外的信息,我会张贴这些下次我有一个问题与他的。DB的东西在我的舒适区之外,所以我甚至不确定在这里发布什么信息:-这只在你的id值没有差距的情况下有效-这是真的。我用作ID列的SERIAL/BIGSERIAL严格按顺序排列,但不一定没有间隙。