From 3016fa601027a76baf8158e12143a918164abecc Mon Sep 17 00:00:00 2001 From: Jesse Hallam Date: Wed, 6 Apr 2022 09:21:01 -0300 Subject: [PATCH] MM-42919: avoid sequential scan on Posts (#19878) On Postgres, `GetTeamsUnreadForUser` triggers a sequential scan on `Posts`. We can avoid this by querying the `Threads` table directly and only joining to `Posts` to eliminate deleted threads. (We could avoid the latter if we later denormalize `DeleteAt` onto `Threads`.) Fixes: https://mattermost.atlassian.net/browse/MM-42919 --- store/sqlstore/thread_store.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/store/sqlstore/thread_store.go b/store/sqlstore/thread_store.go index 8795d96e2b..44066fed85 100644 --- a/store/sqlstore/thread_store.go +++ b/store/sqlstore/thread_store.go @@ -358,12 +358,13 @@ func (s *SqlThreadStore) GetTeamsUnreadForUser(userID string, teamIDs []string) go func() { defer wg.Done() repliesQuery, repliesQueryArgs, err := s.getQueryBuilder(). - Select("COUNT(DISTINCT(Posts.RootId)) AS Count, TeamId"). - From("Posts"). - LeftJoin("ThreadMemberships ON Posts.RootId = ThreadMemberships.PostId"). - LeftJoin("Channels ON Posts.ChannelId = Channels.Id"). + Select("COUNT(Threads.PostId) AS Count, TeamId"). + From("Threads"). + LeftJoin("ThreadMemberships ON Threads.PostId = ThreadMemberships.PostId"). + LeftJoin("Channels ON Threads.ChannelId = Channels.Id"). + LeftJoin("Posts ON Posts.Id = Threads.PostId"). Where(fetchConditions). - Where("Posts.CreateAt > ThreadMemberships.LastViewed"). + Where("Threads.LastReplyAt > ThreadMemberships.LastViewed"). GroupBy("Channels.TeamId"). ToSql() if err != nil {