a better query to delete from hashtags
authorfaried nawaz <faried@gmail.com>
Tue, 20 Apr 2021 22:52:32 +0000 (03:52 +0500)
committerfaried nawaz <faried@gmail.com>
Fri, 7 May 2021 21:00:43 +0000 (02:00 +0500)
old query:

Delete on hashtags  (cost=5089.81..5521.63 rows=6160 width=18)
   ->  Hash Semi Join  (cost=5089.81..5521.63 rows=6160 width=18)
         Hash Cond: (hashtags.id = ht.id)
         ->  Seq Scan on hashtags  (cost=0.00..317.28 rows=17528 width=14)
         ->  Hash  (cost=5012.81..5012.81 rows=6160 width=20)
               ->  Merge Anti Join  (cost=0.70..5012.81 rows=6160 width=20)
                     Merge Cond: (ht.id = hto.hashtag_id)
                     ->  Index Scan using hashtags_pkey on hashtags ht  (cost=0.29..610.53 rows=17528 width=14)
                     ->  Index Scan using hashtags_objects_pkey on hashtags_objects hto  (cost=0.42..3506.48 rows=68158 width=14)

new query:

Delete on hashtags ht  (cost=0.70..5012.81 rows=6160 width=12)
   ->  Merge Anti Join  (cost=0.70..5012.81 rows=6160 width=12)
         Merge Cond: (ht.id = hto.hashtag_id)
         ->  Index Scan using hashtags_pkey on hashtags ht  (cost=0.29..610.53 rows=17528 width=14)
         ->  Index Scan using hashtags_objects_pkey on hashtags_objects hto  (cost=0.42..3506.48 rows=68158 width=14)

lib/mix/tasks/pleroma/database.ex

index 53ad58b6458c2d9721ca8a57c307281327a1b64b..bcde07774fb71b9365bec0bdc75169ebc4196aa6 100644 (file)
@@ -97,12 +97,10 @@ defmodule Mix.Tasks.Pleroma.Database do
     |> Repo.delete_all(timeout: :infinity)
 
     prune_hashtags_query = """
-    delete from hashtags
-    where id in (
-      select id from hashtags as ht
-      left join hashtags_objects as hto
-      on hto.hashtag_id = ht.id
-      where hto.hashtag_id is null)
+    delete from hashtags as ht
+    where not exists (
+      select 1 from hashtags_objects hto
+      where ht.id = hto.hashtag_id)
     """
 
     Repo.query(prune_hashtags_query)