更快并不总是更好:在 Python 中选择正确的 PostgreSQL 插入策略(+基准)

PostgreSQL 速度很快。你的 Python 代码是否能够或应该跟上取决于上下文。本文对各种插入策略进行了比较和基准测试,重点不是微基准测试,而是安全性、抽象性和吞吐量之间的权衡,并为工作选择正确的工具。文章更快并不总是更好:在 Python 中选择正确的 PostgreSQL 插入策略(+基准)首先出现在 Towards Data Science 上。

来源:走向数据科学

演示了每秒 2M 条记录插入 Postgres 是完全可能的。在本文中,我们不会追逐微基准,而是退一步问一个更重要的问题:哪些抽象实际上适合我们的工作负载?

我们将了解使用 Python 将数据插入 Postgres 的 5 种方法。我们的目标不是仅仅关注插入速度并加冕胜利者,而是了解抽象、安全、便利和性能之间的权衡。

最后你会明白:

  • ORM、Core 和驱动级插入的优缺点
  • 当性能真正重要时
  • 如何在不过度设计的情况下选择正确的工具
  • 为什么快速插入很重要

    大容量插入工作负载随处可见:

  • 加载数百万条记录
  • 从外部 API 同步数据
  • 回填分析表
  • 将事件或日志摄取到仓库
  • 微小的低效率会迅速加剧。将 3 分钟的插入作业变成 10 秒的作业可以减少系统负载、释放工作人员并提高整体吞吐量。

    也就是说,更快并不意味着更好。当工作量很小时,为了边际收益而牺牲清晰度和安全性很少会得到回报。

    了解性能何时重要及其原因才是真正的目标。

    我们使用什么工具来插入?

    要与我们的 Postgres 数据库对话,我们需要一个数据库驱动程序。在我们的例子中,这是 psycopg3,SQLAlchemy 位于顶部。这是一个快速区别:

    Psycopg3(驱动程序)

    psycopg3 是 Python 的低级 PostgreSQL 驱动程序。这是一个非常薄的抽象,具有最小的开销,可以直接与 Postgres 对话。

    权衡是责任:您自己编写 SQL、管理沐浴并显式处理正确性。

    SQLAlchemy

    SQLAlchemy 位于 psycopg3 等数据库驱动程序之上,并提供两层:

    1) SQLAlchemy 核心 2) SQLAlchemy ORM 简而言之:

    简单地说:

  • ORM帮助您更轻松地使用Core
  • Core 可帮助您更安全且与数据库无关地使用驱动程序
  • 基准

    为了保持基准公平:

  • 每个方法都以其设计的形式接收数据