diff --git a/src/ir/transformation/dnf.rs b/src/ir/transformation/dnf.rs
index 922e72236036b390677cf986ba9f4629c66e2380..3eb25c7cfe44e826303904224850bbe9c7b4dd59 100644
--- a/src/ir/transformation/dnf.rs
+++ b/src/ir/transformation/dnf.rs
@@ -89,6 +89,14 @@ impl Chain {
         }
     }
 
+    fn reserve(&mut self, additional: usize) {
+        self.nodes.reserve(additional);
+    }
+
+    fn length(&self) -> usize {
+        self.nodes.len()
+    }
+
     /// Append a new node to the chain. Keep AND and OR nodes in the back,
     /// while other nodes in the front of the chain double-ended queue.
     fn push(&mut self, expr_id: usize, plan: &Plan) -> Result<(), QueryPlannerError> {
@@ -196,6 +204,7 @@ impl Plan {
                     }
                     Bool::Or => {
                         let mut new_chain = chain.clone();
+                        new_chain.reserve(capacity - new_chain.length());
                         new_chain.push(*right, self)?;
                         stack.push(new_chain);
                         chain.push(*left, self)?;
diff --git a/src/ir/transformation/merge_tuples.rs b/src/ir/transformation/merge_tuples.rs
index b1f77257739b03019ec7aaef842138a2801e2b5b..35d208ff2f607d3860434e7793f29f35bb3cf5b4 100644
--- a/src/ir/transformation/merge_tuples.rs
+++ b/src/ir/transformation/merge_tuples.rs
@@ -93,8 +93,8 @@ impl Chain {
                 match self.grouped.entry(group_op) {
                     Entry::Occupied(mut entry) => {
                         let (left, right) = entry.get_mut();
-                        let new_left_id = plan.expr_clone(left_id)?;
-                        let new_right_id = plan.expr_clone(right_id)?;
+                        let new_left_id = left_id;
+                        let new_right_id = right_id;
                         plan.get_columns_or_self(new_left_id)?
                             .iter()
                             .for_each(|id| {
@@ -107,8 +107,8 @@ impl Chain {
                             });
                     }
                     Entry::Vacant(entry) => {
-                        let new_left_id = plan.expr_clone(left_id)?;
-                        let new_right_id = plan.expr_clone(right_id)?;
+                        let new_left_id = left_id;
+                        let new_right_id = right_id;
                         entry.insert((
                             plan.get_columns_or_self(new_left_id)?,
                             plan.get_columns_or_self(new_right_id)?,
@@ -119,8 +119,7 @@ impl Chain {
             }
         }
 
-        let new_expr_id = plan.expr_clone(expr_id)?;
-        self.other.push(new_expr_id);
+        self.other.push(expr_id);
         Ok(())
     }