Postgresql 博士后不';t使用带有“的索引”;“订购”; 我有一张很大的桌子 我在col1列上有一个索引 我想得到col1所排序的数据 从查询计划中,我可以说它没有使用索引 当我添加“LIMIT”时,它开始使用索引 对于“LIMIT”的较大值,它将停止使用索引

Postgresql 博士后不';t使用带有“的索引”;“订购”; 我有一张很大的桌子 我在col1列上有一个索引 我想得到col1所排序的数据 从查询计划中,我可以说它没有使用索引 当我添加“LIMIT”时,它开始使用索引 对于“LIMIT”的较大值,它将停止使用索引,postgresql,indexing,sql-order-by,limit,Postgresql,Indexing,Sql Order By,Limit,有线索吗 另外,我希望获得col1值(不必排序)聚集的数据,以及除“排序依据”之外的任何建议 谢谢 如果从表中返回所有行,索引扫描将比表扫描慢。 为什么您认为需要使用索引 你可以尝试使用 设置启用\u seqscan=false 为了禁用顺序扫描,但我确信这会比顺序扫描慢 ORDER BY是对数据进行排序的唯一方法。你可能看到的任何其他排序都纯粹是巧合 编辑 要澄清问题:我不建议关闭seq scan。我刚刚发布了这篇文章,以表明seq扫描确实比索引扫描快。一旦关闭,使用索引扫描的执行计划很可能会

有线索吗

另外,我希望获得col1值(不必排序)聚集的数据,以及除“排序依据”之外的任何建议


谢谢

如果从表中返回所有行,索引扫描将比表扫描慢。 为什么您认为需要使用索引

你可以尝试使用

设置启用\u seqscan=false

为了禁用顺序扫描,但我确信这会比顺序扫描慢

ORDER BY是对数据进行排序的唯一方法。你可能看到的任何其他排序都纯粹是巧合

编辑

要澄清问题:我不建议关闭seq scan。我刚刚发布了这篇文章,以表明seq扫描确实比索引扫描快。一旦关闭,使用索引扫描的执行计划很可能会比显示OP无需索引扫描的顺序扫描慢。

除了带有“无”名称的“马”的答案之外:

使用索引实际上是两个不同的操作:首先,在索引中查找所需的值。索引中是完整记录的地址,该记录随后被取消引用。对于特定的查询,这两种操作都非常快速


如果您打算使用全部或大部分记录,好处就消失了。如果需要所有记录并遍历索引,则需要更长的时间,因为每个记录都有两个查找。在没有索引的情况下运行整个表更容易,因为每列只需要一次搜索(是的,我知道,实际上它比这个要少,因为整个块都被读取等等。我只想保持简单)。

假设这是一个键->值表。我想返回所有的行,但是具有相同键的记录在结果集中应该是连续的,但是排序并不重要。这是对数据进行排序的唯一可靠方法关闭enable_seqscan是一个非常糟糕的主意,它不能解决真正的问题。@Frank:我特别写过,它会更慢。我只是想向OP a展示一种方法,以验证表扫描确实比seq扫描快。从理论上讲,使用索引可以立即流式传输数据,而无需内存开销,而不是等到排序计算并存储后再发送到客户端。但使用索引可以节省排序时间,我想是的。不,这整个解释都是关于为什么不。也请阅读手册中类似的部分。我不知道Postgres如何在内存中排序数据,但对于从表中顺序读取所有/大部分数据,我可以想象在读取数据时动态执行treesort会比使用具有所需顺序的索引时所经历的额外间接寻址和缓存滥用快得多。EXPLAIN Analysis的结果在哪里?没有它,没有人知道事情为什么不像你想象的那样运转。