如何在几分之一秒内复制列表并导入 postgresql 数据库中


我有一个数组列表,其中包含超过 100 万条记录,我想使用 Copy-manger 等内置方法或任何导入速度更快的方法将其转储为 PostgreSQL 数据库中的方式postgresql 中的大量数据

我的代码如下

我尝试过的:

@Service
public class OrderProcessingService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    public void process_data(String hfrcode, List<Order> order) {
            
    List<Order> orderList = new ArrayList<>(); 
  
    for(var data : order) {
    Order order_data = new Visit();
    order_data .setUuid(UUID.randomUUID().toString());
    order_data .setOrderID(data.getOrderID());
    order_data .setOrderDate(data.getOrderDate());
    order_data .setWeight(data.getWeight());
    order_data .setOrderQuantity(data.getOrderQuantity());
    order_data .setOrderLocation(data.getOrderLocation());
    orderList.add(order_data );
    }

   orderRepository.saveAll(orderList);
 }
} 

我不想保存列表,而是将其复制并将其转储到 PostgreSQL 数据库中,这样我就可以最大限度地减少将数据导入数据库的执行时间。

解决方案1

没有人可以保证您“在几分之一秒内”向数据库添加一百万行,无论是否为 PostgreSQL – 这将取决于太多因素:运行数据库引擎的计算机、其活动级别DB,数据库计算机和运行代码的计算机之间的连接。
想一想:如果您要添加 1,000,000 行,并且每行有 100 个字符(通常是保守估计),那么您需要传输 100 兆字节 – 这是很大的带宽:千兆位网络将需要一秒或更长时间才能传输数据。如果网络上没有其他流量,则在两台计算机之间传输! 这是在数据库引擎开始处理它并开始处理数据库文件中的行以存储它们之前。

考虑一下您想要做什么以及为什么,然后考虑可以大量减少数据的方法,而不是假设它“只是一个软件问题”。

解决方案2

如果不知道数据的来源,这几乎是一个无法回答的问题。 从这个角度来看,确实会发生一些事情。 您正在添加一个随机 UUID,但数据库可以轻松自动生成该 UUID。 没有其他东西依赖于这个值。 如果数据来自 API 调用的结果,您可以使用 ETL 工具,例如 高性能CC系统[^] 为您做繁重的工作。

最终,您将必须尝试一些事情才能找出最适合您的方法。

コメント

タイトルとURLをコピーしました