【问题标题】:Postgres index for a conditional join条件连接的 Postgres 索引
【发布时间】:2021-01-27 10:30:33
【问题描述】:

我有 3 张表(这里都简化了)

job (id int, type char(1))
data (job_id int, owner int, creator int, value int)
user (id int)

我的查询是

select user.id, job.id, sum(data.value)
from job
join data on job.id = data.job_id
join user on case job.type when 'O' then data.owner else data.creator end = user.id
group by user.id, job.id

如何在 Postgres 中创建一个索引来满足连接中的 case 语句?

Job 可能有十几行、1000 多个用户和数百万数据。

谢谢

【问题讨论】:

  • 条件需要来自两个不同表的值。您无法为此创建索引。只能使用您为其定义索引的表中的列在表达式上定义索引。
  • 顺便说一句:这是 CASE 表达式而不是陈述。
  • 恐怕是这样……然后回到绘图板上。还是谢谢。
  • 您的查询的执行计划是什么?
  • 将其更改为两个带有UNION ALL 的查询。

标签: database postgresql indexing


【解决方案1】:

在您的示例中,您不需要“用户”表来获取结果:

SELECT 
    CASE 
        WHEN job.type = '0' THEN DATA.OWNER
        ELSE DATA.creator
    END AS user_id,
    job.ID,
    DATA.VALUE
FROM
    job
    JOIN DATA ON job.ID = DATA.job_id -- indexes on the id's
GROUP BY 1,2;

编辑:假设:“数据”和“用户”之间有一个外键,用于检查用户是否存在。

【讨论】:

  • 唉,他们之间没有钥匙。数据实际上只包含我需要加入以获取 ID 的用户的电子邮件。
【解决方案2】:

这似乎是不可能的。通过重构代码以在每种类型的数据中添加一行以及一个新的“类型”列,然后对此进行索引,解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 2020-12-24
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-12-21
    • 2022-08-16
    • 2013-12-05
    相关资源
    最近更新 更多