有一个这样结构的表:
Table "public.all_emails"
│ Column | Type | Modifiers
│ ----------- + -------- + -----------
│ email | text |
│ frequency | bigint |
│Indexes:
│ "all_emails_email_idx" UNIQUE, btree (email)
我想通过对它们进行更多操作,将所有记录从该表移动到另一个数据库。为了加快速度,我编写了多进程应用程序,该应用程序需要几次特定的表。为了知道以下哪个过程开始,我按如下方式对表格进行排序:
Select email from all_emails order by email limit # {PULL_SIZE} offset # {offset}
在表中有大量记录的情况下,此操作相当昂贵且不是最优的。我怎样才能让它变得更好?
最佳答案
您可以 CLUSTER
用于此目的的表:
CLUSTER all_emails USING all_emails_email_idx;
ANALYZE all_emails;
集群根据指定的索引对表中的行进行物理重新排序。因此,电子邮件地址是根据电子邮件地址排序的,然后查询(其处理过程与任何其他查询一样)将在有限数量的磁盘页面上找到所请求子集中的所有行,因此 I/O 也减少了与任何排序一样(因为查询规划器认识到该表是在特定索引上聚集的)。 ANALYZE
命令在聚类后更新表统计信息,以帮助查询规划器做出最佳选择。
这实际上只适用于只读或不经常更新或插入新行的表,因为没有维护集群:这是一次性过程。聚簇也是一个相当“昂贵”的过程,因为整个表都被重写并且需要独占表锁。您可以使用缩写形式 CLUSTER all_emails
的相同索引定期重新聚类该表。
关于postgresql - Postgres,排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39405912/