DeepSeek辅助总结的测试PostgreSQL数据库插入性能方法

原文地址:https://github.com/danielbeach/testingArrowADBCdrivers

测试数据库插入性能

本项目比较了将 CSV 文件读取并插入数据库的不同方法,包括:

  • PyArrow + ADBC - 使用 PyArrow 读取 CSV,并使用 ADBC 驱动插入 Postgres
  • Polars + ADBC - 使用 Polars 读取 CSV,并使用 ADBC 驱动插入 Postgres
  • psycopg2 + COPY - 使用 Python 的 csv 模块和 psycopg2 的 COPY 命令
  • DuckDB + COPY - 使用 DuckDB 的原生 COPY 命令

前提条件

  • Python 3.12+
  • Docker 和 Docker Compose(用于本地 Postgres)
  • uv 包管理器(或手动安装依赖项)

设置

  1. 安装依赖项:
bash 复制代码
uv sync

或使用 pip:

bash 复制代码
pip install -e .

启动本地 Postgres 数据库

使用 Docker Compose 启动本地 PostgreSQL 数据库:

bash 复制代码
docker compose up -d

这将启动一个 Postgres 16 容器,配置如下:

  • 主机:localhost
  • 端口:5432
  • 数据库:postgres
  • 用户名:postgres
  • 密码:postgres

容器将被命名为 adbc-postgres,数据将持久保存在 Docker 卷中。

检查 Postgres 状态

检查 Postgres 是否正在运行:

bash 复制代码
docker-compose ps

查看日志:

bash 复制代码
docker-compose logs postgres

停止 Postgres

停止 Postgres 容器:

bash 复制代码
docker-compose down

停止并删除所有数据:

bash 复制代码
docker-compose down -v

可用脚本

所有脚本从 data/uncompressed/ 目录读取 CSV 文件并将其插入数据库。每个脚本创建不同的表名,以便您可以比较结果。

1. PyArrow + ADBC (pyarrow_adbc_driver.py)

使用 PyArrow 的 dataset API 读取 CSV,并使用 ADBC 驱动插入 Postgres。

bash 复制代码
python pyarrow_adbc_driver.py

表名 :divvy_tripdata

特点:

  • 使用 PyArrow 高效的 dataset API 读取多个 CSV 文件
  • 转换为 Arrow 表格式
  • 使用 ADBC 的 adbc_ingest() 进行批量插入
  • 创建具有适当类型映射的表

2. Polars + ADBC (polars_adbc_driver.py)

使用 Polars 读取 CSV,并使用 Polars 内置的 write_database() 方法与 ADBC 引擎。

bash 复制代码
python polars_adbc_driver.py

表名 :divvy_tripdata_polars

特点:

  • 使用 Polars 快速读取 CSV
  • 利用 Polars 原生的 write_database() 方法
  • 自动模式推断和表创建
  • 底层使用 ADBC 引擎

3. psycopg2 + COPY (psycopg2_driver.py)

使用 Python 内置的 csv 模块和 psycopg2 的 COPY 命令(最快的 psycopg2 方法)。

bash 复制代码
python psycopg2_driver.py

表名 :divvy_tripdata_psycopg2_noarrow

特点:

  • 纯 Python 读取 CSV(无需 Arrow 依赖)
  • 通过 copy_expert() 使用 PostgreSQL 的原生 COPY 命令
  • 基于样本数据的类型推断
  • 针对批量插入进行优化

4. DuckDB + COPY (duckdb_copy_driver.py)

使用 DuckDB 的原生 COPY 命令直接加载 CSV 文件。

bash 复制代码
python duckdb_copy_driver.py

表名 :divvy_tripdata_duckdb(位于 DuckDB 数据库文件中)

特点:

  • 创建本地 DuckDB 数据库文件(divvy_data.duckdb)
  • 使用 DuckDB 的 COPY FROM 命令
  • 自动模式推断
  • 以 DuckDB 的列式格式存储数据

连接配置

使用默认连接(Docker Postgres)

所有 Postgres 脚本(DuckDB 除外)默认使用 Docker Postgres 设置:

bash 复制代码
# 启动 Postgres
docker-compose up -d

# 运行任何脚本
python pyarrow_adbc_driver.py
python polars_adbc_driver.py
python psycopg2_driver.py

使用自定义连接

您可以使用环境变量覆盖 Postgres 连接参数:

bash 复制代码
export PGHOST=your-host
export PGPORT=5432
export PGDATABASE=your-database
export PGUSER=your-user
export PGPASSWORD=your-password

python pyarrow_adbc_driver.py

性能比较

所有脚本都包含计时信息,显示:

  • 总插入时间
  • 每秒行数吞吐量
  • 行数验证

这使您可以比较不同方法的性能:

  • ADBC 方法(PyArrow/Polars) - 利用 Arrow 格式实现零拷贝传输
  • psycopg2 COPY - 使用 PostgreSQL 的原生批量加载
  • DuckDB COPY - 优化的列式数据库,具有原生 CSV 加载功能

运行所有脚本并比较计时结果,以了解哪种方法最适合您的用例!

相关推荐
captain3762 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
小此方3 小时前
Re:Mysql数据库基础篇(八):详细讲解复合查询、多表查询、自连接、多行、多列子查询与合并查询
数据库·mysql
xszivvvv3 小时前
Mariadb数据库frm文件异常,如何恢复数据
数据库·mariadb
smile_life_3 小时前
MySQL 设置 防止账户被暴力破解
数据库·mysql
ShineWinsu4 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
测试盐4 小时前
oracle数据库卡顿排查
数据库·oracle
滕州市燕猫虎计算机科技工作室个体工商户4 小时前
MySQL、MVCC、多版本并发控制
数据库·mysql·mvcc·数据库事务
明航咨询-陈老师4 小时前
ITSS运行维护服务能力成熟度认证技术纵深:标准模型、等级路径、2026审核趋势与CS/CMMI对比
服务器·数据库·cmmi
缓慢更新5 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
AI小百科5 小时前
向量数据库:AI 的「记忆仓库」是怎么工作的
数据库·人工智能·oracle