【问题标题】:Configuring Merge Join in PostgreSQL在 PostgreSQL 中配置合并连接
【发布时间】:2023-04-02 13:00:01
【问题描述】:

我在使用 PostgreSQL 处理大表,查询耗时太长。

我有两张桌子。第一个大约有 600 万行(数据表),第二个大约有 30000 行(用户表)。

每个用户在数据表中大约有 200 行。 之后,data 和 users 表可能会增加多达 30 倍。

我的查询是:

SELECT d.name, count(*) c
  FROM users AS u JOIN data AS d on d.id = u.id  
  WHERE u.language = 'eng' GROUP BY d.name ORDER BY c DESC LIMIT 10;

90%的用户有eng语言,查询时间为7秒。每列都有索引!

我读到了 Merge Join,它应该非常快,所以我按 id 对表进行排序并强制 Merge Join,但时间增加到 20 秒。

我想,表配置错误,但我不知道如何修复它。

我应该进行其他改进吗?

【问题讨论】:

标签: sql postgresql join postgresql-performance


【解决方案1】:

对于这个查询:

SELECT d.name, count(*) c
FROM users u JOIN
     data d
     on d.id = u.id  
WHERE u.language = 'eng'
GROUP BY d.name
ORDER BY c DESC
LIMIT 10;

首先,尝试索引:users(language, id)data(id, name)。看看这是否加快了查询速度。

第二,d.name是什么?一个用户可以拥有多个吗?是否有有效值表?根据这些问题的答案,可能还有其他方式来构建查询。

【讨论】:

  • 我尝试了这些索引,时间没有改变...... d.name是一些字符串,每个用户在数据表中大约有200行。这意味着:用户有大约 200 个唯一名称值。我只是想知道,这个名字在英语、德语和其他用户中有多受欢迎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2013-05-27
  • 2017-03-29
  • 2014-01-15
  • 2015-08-14
  • 2020-09-13
相关资源
最近更新 更多