开发者社区 > PolarDB开源 > PolarDB 分布式版 > 正文

请教个问题,postgres排序算法,如果索引不是唯一索引,是不是排序的时候就需要实时的快排啊,我分

请教个问题,postgres排序算法,如果索引不是唯一索引,是不是排序的时候就需要实时的快排啊,我分别用一个唯一索引和非唯一索引排序,差别很大,就cost来看差很多,

展开
收起
白夜行fighting 2023-09-20 18:01:52 49 0
6 条回答
写回答
取消 提交回答
  • PostgreSQL的排序算法主要取决于你使用的排序键是否有索引。如果有索引,那么PostgreSQL会使用索引来加速排序过程。如果没有索引,那么PostgreSQL会使用TPC-H标准的快速排序算法。

    如果你有一个非唯一索引,那么在排序时,PostgreSQL仍然可以使用索引来加速排序过程。但是,由于非唯一索引可能包含重复的值,因此在使用索引进行排序时,PostgreSQL可能需要额外的步骤来处理这些重复的值。这可能会导致排序过程的性能降低。

    如果你在排序时使用的是唯一索引,那么PostgreSQL可以直接使用索引来加速排序过程,而不需要处理任何重复的值。因此,在这种情况下,排序过程的性能可能会更好。

    至于你提到的"cost",我猜你可能是在查看EXPLAIN命令的结果。在PostgreSQL中,"cost"表示执行查询所需的CPU时间。如果你的查询使用了索引来加速排序过程,那么"cost"通常会较低,因为索引可以显著减少CPU的使用。反之,如果你的查询没有使用索引来加速排序过程,那么"cost"可能会较高,因为快速排序算法通常需要更多的CPU时间。

    2023-09-21 08:33:47
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,在 PostgreSQL 中,当使用非唯一索引进行排序时,实际上是按照索引的 B 树结构进行排序的。这种排序算法称为索引扫描排序(Index Scan Sort)。它首先按照索引顺序遍历索引中的所有行,然后将它们按照排序条件排序后返回结果。

    相比之下,使用唯一索引进行排序时,PostgreSQL 可以使用索引扫描排序或者使用索引本身来直接返回有序的结果。这种排序算法称为索引顺序扫描排序(Index Only Scan Sort),不需要再使用快排等算法进行排序,因此效率会更高。

    综上所述,使用唯一索引进行排序的效率确实更高一些,但如果使用非唯一索引进行排序,也不会实时进行快排,而是使用索引扫描排序。

    2023-09-21 08:06:16
    赞同 展开评论 打赏
  • PostgreSQL 使用不同的排序算法来处理索引排序,具体取决于您使用的索引类型和查询条件。如果索引不是唯一索引,在进行排序时,PostgreSQL 通常会使用基于排序算法的策略。

    对于非唯一索引,PostgreSQL 将使用内部的排序算法,如归并排序(Merge Sort)或快速排序(Quick Sort),以实现排序操作。这些排序算法可以在内存中或磁盘上执行,具体取决于排序数据的大小和可用内存资源。

    相比之下,唯一索引允许 PostgreSQL 使用更高效的排序算法,如索引扫描(Index Scan)。唯一索引本身已经按照特定顺序进行了排序,因此可以直接利用索引的有序性,避免了实时的排序操作,从而提高性能。

    根据您提到的 "cost" 差异,我可以理解为查询计划中的代价估算器。当使用唯一索引进行排序时,由于无需实时排序,查询计划的代价较低。而使用非唯一索引进行排序时,由于需要进行实时排序操作,查询计划的代价较高。

    2023-09-20 19:25:13
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在 PostgreSQL 中,排序的行为取决于具体的查询和索引情况。当进行排序操作时,PostgreSQL 会根据不同的情况选择合适的排序算法。

    如果使用的是唯一索引进行排序,那么数据库可以直接利用索引的有序性进行快速排序。这是因为唯一索引中的键值都是唯一的,所以它们自然就是有序的,无需进一步排序操作。

    而对于非唯一索引,PostgreSQL 将使用不同的排序算法,如合并排序(Merge Sort)或快速排序(Quick Sort)。这些算法会根据数据量和性能考虑来选择最合适的排序策略。

    在比较两者效率时,唯一索引通常会更快,因为它可以直接利用索引的有序性,并避免了实际的排序过程。但这并不意味着非唯一索引的排序会一定很慢,具体的性能差异还受到其他因素的影响,例如数据的分布、查询的复杂度等。

    此外,PostgreSQL 还支持配置参数 work_memmaintenance_work_mem,通过调整这些参数的值,您可以对排序操作的内存使用进行优化,从而提高排序的性能。

    2023-09-20 19:04:37
    赞同 展开评论 打赏
  • 创建唯一索引。如果可能的话,可以创建唯一索引来优化查询性能。
    优化查询语句。可以尝试优化查询语句,减少查询中需要排序的字段数量,或者使用更高效的排序算法。
    使用其他索引技术。可以尝试使用其他索引技术,例如B树索引、位图索引等,来提高查询性能。

    2023-09-20 18:51:13
    赞同 展开评论 打赏
  • vacuum analyze一下.
    创建索引是否有先后, 中间是否有过大量的DML

    此答案来自钉钉群“PG|POLARDB技术进阶”

    2023-09-20 18:05:05
    赞同 展开评论 打赏
滑动查看更多

PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 是阿里云自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载