在Sping Boot 中使用Oracle数据库删除大量记录的最佳方法是什么?如何实现批量删除的最佳方法?我们应该首先获取要删除的ID还是可以在同一个操作中完成?所有内容都应该在一个事务中还是拆分它们更好?我尝试首先获取id,然后通过List.partition(ids,batchsize)将它们分开,并在transaction中对每个执行delete。
btqmn9zl1#
如何实现批量删除的最佳方式?-最佳方式始终取决于您的要求。我们应该先提取id来删除还是可以在同一个操作中完成?-如果你手边有id,那么你可以直接删除,如果没有,那么显然你需要提取和删除,你可以使用原生sql查询来执行删除,而不需要id操作。所有的东西都应该放在一个交易中,还是分开更好?
记住删除和插入会消耗你的w.r.t你的数据库索引和可能的应用程序性能开销。尝试使用代码来避免它,而不是删除,用另一个列更新它为无效,并有一些触发器/TTL/Cron作业来定期清理该表,当你的数据库/应用程序不活跃/不太活跃时。
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.**事务:**将删除拆分为更小的事务可能会减少资源锁定的时间并提高性能。请评估权衡和对系统的潜在影响。
2条答案
按热度按时间btqmn9zl1#
如何实现批量删除的最佳方式?-最佳方式始终取决于您的要求。
我们应该先提取id来删除还是可以在同一个操作中完成?-如果你手边有id,那么你可以直接删除,如果没有,那么显然你需要提取和删除,你可以使用原生sql查询来执行删除,而不需要id操作。
所有的东西都应该放在一个交易中,还是分开更好?
记住删除和插入会消耗你的w.r.t你的数据库索引和可能的应用程序性能开销。尝试使用代码来避免它,而不是删除,用另一个列更新它为无效,并有一些触发器/TTL/Cron作业来定期清理该表,当你的数据库/应用程序不活跃/不太活跃时。
xeufq47z2#
恕我直言,批量执行删除是有效管理大规模数据删除的常用方法。
1.使用Spring Data JPA
如果您正在使用Spring Data JPA,一种有效的方法是利用Spring Data JPA存储库提供的deleteInBatch方法批量删除实体。
下面是一个示例:
字符串
您应该根据您的要求更改查询。
需要考虑的事项:
1.**优化批量大小:**尝试不同的批量大小以找到最佳批量大小。较大的批量大小可能更有效,但也可能会锁定资源更长时间。
1.**事务:**将删除拆分为更小的事务可能会减少资源锁定的时间并提高性能。请评估权衡和对系统的潜在影响。