diff --git a/app/models/communication/website/with_connected_objects.rb b/app/models/communication/website/with_connected_objects.rb
index 0184fe1eb4b2e8072ab084f7ce9bc67961f2c3dd..99efa55b47545006bc133e29b050438a19acb2d8 100644
--- a/app/models/communication/website/with_connected_objects.rb
+++ b/app/models/communication/website/with_connected_objects.rb
@@ -11,12 +11,19 @@ module Communication::Website::WithConnectedObjects
   # - par un objet avec des connexions lorsqu'il est destroyed
   # - par le website lui-même au changement du about
   def destroy_obsolete_connections
-    # TODO: optimiser
     up_to_date_dependencies = recursive_dependencies
+    deletable_connection_ids = []
     connections.find_each do |connection|
-      connection_obsolete = !connection.indirect_object.in?(up_to_date_dependencies)
-      connection.destroy if connection_obsolete
+      has_living_connection = up_to_date_dependencies.detect { |dependency|
+        dependency.class.name == connection.indirect_object_type &&
+        dependency.id == connection.indirect_object_id
+      }
+      deletable_connection_ids << connection.id unless has_living_connection
     end
+    # On utilise delete_all pour supprimer les connexions obsolètes en une unique requête DELETE FROM
+    # Cependant, on peut le faire car les connexions n'ont pas de callback.
+    # Dans le cas où on en rajoute au destroy, il faut repasser sur un appel de destroy sur chaque
+    connections.where(id: deletable_connection_ids).delete_all
   end
 
   def has_connected_object?(indirect_object)