oracle Spring Boot -从表中删除大量数据行

6ovsh4lw  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(161)

在Sping Boot 中使用Oracle数据库删除大量记录的最佳方法是什么?如何实现批量删除的最佳方法?我们应该首先获取要删除的ID还是可以在同一个操作中完成?所有内容都应该在一个事务中还是拆分它们更好?
我尝试首先获取id,然后通过List.partition(ids,batchsize)将它们分开,并在transaction中对每个执行delete。

btqmn9zl

btqmn9zl1#

如何实现批量删除的最佳方式?-最佳方式始终取决于您的要求。
我们应该先提取id来删除还是可以在同一个操作中完成?-如果你手边有id,那么你可以直接删除,如果没有,那么显然你需要提取和删除,你可以使用原生sql查询来执行删除,而不需要id操作。
所有的东西都应该放在一个交易中,还是分开更好?

  • 这里来了你要删除什么,删除操作的意义是什么,如果它之间的失败,
  • 如果一个批处理失败,另一个批处理成功,您的应用程序是否会处于不一致的状态?

记住删除和插入会消耗你的w.r.t你的数据库索引和可能的应用程序性能开销。尝试使用代码来避免它,而不是删除,用另一个列更新它为无效,并有一些触发器/TTL/Cron作业来定期清理该表,当你的数据库/应用程序不活跃/不太活跃时。

xeufq47z

xeufq47z2#

恕我直言,批量执行删除是有效管理大规模数据删除的常用方法。
1.使用Spring Data JPA
如果您正在使用Spring Data JPA,一种有效的方法是利用Spring Data JPA存储库提供的deleteInBatch方法批量删除实体。
下面是一个示例:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class YourService {

    @Transactional
    public void deleteInBatches() {
        int pageSize = 500; // Adjust the page size as needed
        int pageNumber = 0;
        Page<Entity> page;

        do {
            page = entityRepository.findAll(PageRequest.of(pageNumber, pageSize));
            List<Entity> entities = page.getContent();
            entityRepository.deleteInBatch(entities);
            pageNumber++;
        } while (!page.isEmpty());
    }
}

字符串
您应该根据您的要求更改查询。

需要考虑的事项:

1.**优化批量大小:**尝试不同的批量大小以找到最佳批量大小。较大的批量大小可能更有效,但也可能会锁定资源更长时间。
1.**事务:**将删除拆分为更小的事务可能会减少资源锁定的时间并提高性能。请评估权衡和对系统的潜在影响。

相关问题