  void Vacuum() override {
    auto n = frame_manager_->FrameCount();
    int64_t i = 0;
    auto page_i = MakeTablePage(frame_manager_->GetFrame(i), schema_);
    page_i->Vacuum();
    int64_t j1 = n - 1;
    auto page_j = MakeTablePage(frame_manager_->GetFrame(j1), schema_);
    int32_t j2 = page_j->TupleCount();
    while (i < j1) {
      while (i < j1 && (j2 == -1 || !page_j->LoadTuple(j2).has_value())) {
        if (j2 == -1) {
          --j1;
          frame_manager_->DeleteLastFrame();
          page_j = MakeTablePage(frame_manager_->GetFrame(j1), schema_);
          j2 = page_j->TupleCount();
        } else {
          --j2;
        }
      }
      if (i >= j1) {
        break;
      }
      auto tuple = page_j->LoadTuple(j2).value();
      auto required_space = Marshaller::RequiredSpaceTuple(tuple.values, tuple.is_null, schema_);
      while (i < j1 && (page_i->FreeSpace() < required_space + sizeof(TupleLocalId))) {
        i++;
        page_i = MakeTablePage(frame_manager_->GetFrame(i), schema_);
        page_i->Vacuum();
      }
      if (i >= j1) {
        break;
      }

      page_j->DeleteTuple(j2--);
      page_i->AppendTuple(tuple);
    }
  }
