我期望 postgresql 有多快?

Cha*_*ieB 2 postgresql performance

我正在评估时间序列应用程序的 postgresql 性能,特别是插入。正在运行速度测试脚本sqlalchemyhttps://docs.sqlalchemy.org/en/13/faq/performance.html#im-inserting-400-000-rows-with-the-orm-and-it-真的很慢。你可以忽略 ORM 的东西,它是显示性能的倒数第二个“核心”行。

我预计每秒会看到 10 到 100k 写入,例如(https://docs.timescale.com/latest/introduction/timescaledb-vs-postgres): PostgreSQL 和 Timescale 比较

但是,我得到的是以下内容:

性能测试结果

所以每秒写入 358 次!相比之下,sqlite 每秒写入 83k。

这对我来说似乎真的很慢,但我在 Windows 安装、Windows 上的 Docker、本机 Ubuntu 和 Ubuntu 上的 Docker 中始终获得这种性能。

我的期望与现实不符,还是我做错了什么?

编辑:

澄清一下,我还没有使用 Timescale DB 的 hyptertables 功能,只是普通的 PostgreSQL 表。我正在使用 TimescaleDB docker 安装进行 docker 测试(尽管不是本机测试)。具体来说,我正在调用

docker run -d --rm -p 5433:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb:latest-pg12
Run Code Online (Sandbox Code Playgroud)

Cha*_*ieB 5

正如 @LaurenzAlb 暗示的那样,使用 SQLAlchemy 获得 PostgreSQL 良好插入性能的技巧是更好地管理事务。SQLAlchemy 可以(但默认情况下不)使用 psycopg2 的executemanyPostgreSQL 帮助程序。

打开这些功能可以提高对同一个表进行多次插入的性能。这是 python 测试的修改后的代码。

    engine = create_engine(DB_NAME, echo=False, executemany_mode='values')
Run Code Online (Sandbox Code Playgroud)

executemany_mode=None

SQLAlchemy Core: Total time for 50000 records 95.0814561843872 secs = 525.8648952855459 /s
Run Code Online (Sandbox Code Playgroud)

executemany_mode="values"

SQLAlchemy Core: Total time for 50000 records 1.761573314666748 secs = 28383.71788656377 /s
Run Code Online (Sandbox Code Playgroud)

有关说明,请参阅https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#psycopg2-batch-mode 。