花费太长时间的视图查询-Postgresql

时间:2018-12-02 12:33:16

标签: sql postgresql query-performance

我认为从2个表进行查询: 消息表和消息状态表。 每条消息都有几种状态。

该视图的目的是为每条消息计算其首尾状态:

//Body Parser middleware
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

//Use routes
app.use('/message', message);

我在(message_id ,date)在状态表中。 该查询花了我8秒钟的时间-我想改善它。

您有什么想法吗?我当时在考虑使用物化视图-但是我在使用它时遇到了麻烦(做刷新使我永远生了)-我应该知道任何最佳实践吗?甚至推荐吗?

非常感谢,

编辑: 例如,

消息包含:

#include<stdio.h>


int main()
{
    int i,j=0;
    char str[50];
    printf("Donnez une chaine: ");
    gets(str);

    for(i=0;str[i]!='\0';++i)
    {
        if(str[i]!=' ')
            str[j++]=str[i];
    }

    str[j]='\0';
    printf("\nSans Espace: %s",str);

    return 0;
}

message_status包含:

with last_msg_status as (
  select distinct on (message_id) message_id,date,type
  from message_status
  order by message_id,date desc
), first_msg_status as (
  select distinct on (message_id) message_id,date,type
  from message_status
  order by message_id,date
)
select *
from messages m
  join last_msg_status ls on ls.message_id = m.id
  join first_msg_status fs on fs.message_id = m.id;

结果应为:

{ {2}}

1 个答案:

答案 0 :(得分:0)

如果您希望每条消息的第一个和最后一个状态,我建议从正确的表开始,看看相关的子查询是否起作用:

select m.*,
       (select ms.status
        from mesasge_status ms
        where ms.message_id = m.id
        order by ms.date asc
        limit 1
       ) as first_status,
       (select ms.status
        from mesasge_status ms
        where ms.message_id = m.id
        order by ms.date desc
        limit 1
       ) as last_status
from messages m;

这至少应该更接近完成您想要的目标。如果message_status(message_id, date)上有一个索引,那么这可能满足您的性能目标。

编辑:

如果要使用多个列,则可以使用元组-或更实际地,可以使用横向联接:

select m.*, ms_first.*, ms_last.*
from messages m cross join lateral
     (select . . .
      from mesasge_status ms
      where ms.message_id = m.id
      order by ms.date asc
      limit 1
     ) ms_first cross join lateral
      (select . . .
      from mesasge_status ms
      where ms.message_id = m.id
      order by ms.date desc
      limit 1
     ) ms_last;