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
)
SQL
그러니까 이건 최소한 O(n^2) 연산인 것 같은데, 맞나요? 해당 테이블에는 69,724,384개의 행이 있으므로, 좋은 아이디어라고 보기 어렵습니다.
@Sikamikanico. 캘린더 플러그인을 다시 원하신다면, 모든 캘린더 이벤트를 삭제하고 처음부터 다시 시작하는 것이 좋을 것 같습니다. 다른 방법으로는 활성 서버에서 해당 쿼리를 실행하여 완료되는지 확인해 볼 수 있습니다.
근본 원인은 시간대가 변경될 때 이벤트를 중복 생성하는 플러그인의 버그라고 생각합니다.
calendar_events 테이블은 11GB입니다:
discourse=# 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만 확실히 비정상적입니다.