如何改进此SQL查询性能?

如何改进此SQL查询性能?,sql,postgresql,inner-join,Sql,Postgresql,Inner Join,我的查询如下所示。我对查询进行了“解释分析”,以查看查询性能中的瓶颈,而连接是罪魁祸首 我有一个表结构的简要说明,以提供更好的想法。表格本身无法更改 table ai { a_id foreign_key i_id foreign_key } table a { id c_id foreign_key } table i { id value } table c { name begin_time id } 下面是SQL查询 选择 不同开

我的查询如下所示。我对查询进行了“解释分析”,以查看查询性能中的瓶颈,而连接是罪魁祸首

我有一个表结构的简要说明,以提供更好的想法。表格本身无法更改

table ai {
   a_id foreign_key
   i_id foreign_key
} 
table a {
   id
   c_id foreign_key
}
table i {
   id
   value
}
table c {
   name
   begin_time
   id
}
下面是SQL查询

选择
不同开启(c.begin\u时间,c.id)
c、 身份证,
c、 名字,
c、 开始时间
从…起
人工智能
内部连接(
ai.i_id=i.id
)
内部连接a ON(
ai.a_id=a.id
)
上的内部联接容器(
a、 c_id=c.id
)
哪里
i、 值='a.b.c.d'
订购人
c、 开始时间描述
我不擅长SQL查询。我想知道是否可以更改查询本身以提高性能。

  • 您的主查询只需要
    c
  • ,其他表格仅用于确定最终结果中是否需要
    c
    记录
  • (如果)
    c
    表不包含重复项:不再需要DISTINCT
简化查询:



您还应该向表中添加主键+外键(可能还有一些额外的索引):DDL中没有
{}
。而且您不需要区分,您只需要从
c
中进行选择。在where子句中使用
存在(…)
。我很困惑。
c.id
是否为主键?如果是这样,为什么需要开始时间?如果没有查询中解释(分析,缓冲区)的结果,几乎不可能看到问题所在。您可以简化查询,但这并不意味着查询会变得很快。可能您遗漏了一些关键索引“WHERE ai.c_id=c.id”失败,因为表“ai”没有外键“c_id”。它只出现在表“a”中。我不得不猜测。请将表的完整DDL添加到问题(下次)查询工作时!我只需要做一些小的改变。非常感谢。
SELECT
  c.id, c.name, c.begin_time
FROM c
WHERE EXISTS (
        SELECT * FROM ai
        JOIN i ON ai.i_id = i.id AND i.value = 'a.b.c.d'
        JOIN a ON ai.a_id = a.id
        WHERE  a.c_id = c.id
        )
ORDER BY c.begin_time DESC
        ;