'bundle exec rake db:migrate' 因日历迁移耗时过长

      DELETE
        FROM calendar_events ce
      WHERE
        ce.id IN (SELECT DISTINCT(ce3.id) FROM calendar_events ce2
                  LEFT JOIN calendar_events ce3 ON ce3.user_id = ce2.user_id AND ce3.description = ce2.description
                  WHERE ce2.start_date >= (ce3.start_date - INTERVAL '1 days')
                    AND ce2.start_date <= (ce3.start_date + INTERVAL '1 days')
                    AND ce2.timezone IS NOT NULL
                    AND ce3.timezone IS NULL
                    AND ce3.id != ce2.id
                    AND ce2.post_id IS NULL
                    AND ce3.post_id IS NULL
        )

所以这看起来至少是一个 O(n^2) 的操作,对吧?那个表里有 69,724,384 行,所以这看起来不是个好主意。

@Sikamikanico。如果你想让日历插件回来,我认为应该做的就是删除所有日历事件,然后你可以重新开始。我们还可以做的另一件事是在活动服务器上运行那个查询,看看它是否能完成。

我认为根本原因是在时区更改时复制事件的插件中的一个错误。

calendar_events 表有 11GB:

SELECT pg_size_pretty( pg_total_relation_size('calendar_events') );
 pg_size_pretty
----------------
 11 GB
(1 row)

以下是最大的表:

       relation       | total_size
----------------------+------------
 calendar_events      | 11 GB
 post_timings         | 6884 MB
 posts                | 2292 MB
 user_auth_token_logs | 1240 MB
 user_actions         | 1055 MB
(5 rows)

只有 calendar_events 明显很奇怪。