postgresql - Postgres,排序

标签 postgresql query-optimization

有一个这样结构的表:

    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/

相关文章:

sql - Postgres max 在几列上

postgresql - 错误请求 : The CSRF tokens do not match - pgadmin4 on Ubuntu

mongodb - 用于存储非关系数据的 AWS 数据库解决方案

sql - 尝试使用 postgres INSERT INTO 表时出现语法错误

database - 将数据库转储加载到 postgres 数据库中

sql - 当连接更改时,MySQL SELECT 将永远运行

mysql - 使用 LEFT JOINS 优化 MySql 查询

php - 只是快速查询吗?

php - 如何将循环中的这两个查询转换为单个 JOINed 查询?

MySQL - 基本的 2 表查询速度慢 - 索引在哪里?