0

0

基于TPC-C基准的Python ORM的性能测试详解

coldplay.xixi

coldplay.xixi

发布时间:2020-07-28 16:57:28

|

3306人浏览过

|

来源于learnku

转载

基于TPC-C基准的Python ORM的性能测试详解

  当开发与数据库需要在一起使用的应用程序时,对象关系映射器(orm)通常用于python编程中。python orm的示例是sqlalchemy,peewee,pony-orm和django。选择orm性能起着至关重要的作用。但是如何比较这些工具集?orm性能基准提供了明确的度量,但仍有很大的改进空间。我研究并扩展了定性的orm基准,以帮助有需要开发需要的。定性的python orm基准tortoise orm(链接到存储库)分析了11种sql查询的六个orm的速度。

相关学习推荐:python视频教程

  通常,Tortoise基准可以评估各种ORM的查询执行速度。但是,这种测试方法存在一个缺陷:大多数ORM被选择用于Web应用程序。在这种情况下,多个用户经常将所有形式的查询发送到数据库。因为在这种情况下没有评估的基准测试工具能够评估Python ORM的性能,所以我决定编写自己的PonyORM和SQLAlchemy进行比较。作为基础,我采用了TPC-C基准。

  自1988年以来,TPC一直在数据处理领域开发测试。它们早已成为行业标准,几乎所有设备供应商都在各种硬件和软件样本上使用它们。这些测试的主要特征是它们专注于在尽可能接近真实条件的巨大负载下进行测试。

  TPC-C模拟仓库网络。它包括五个同时执行的各种类型和复杂性的事务的组合。该测试的目的是评估多个虚拟用户同时访问数据库时事务处理的速度。

  我决定使用适合此任务的TPC-C测试方法测试两个Python ORM(SQLALchemy和PonyORM)。该测试的目的是评估多个虚拟用户同时访问数据库时事务处理的速度。

立即学习Python免费学习笔记(深入)”;

  测试说明

  第一步是创建并填充仓库网络的数据库。

  该数据库包含八个关系:

  1. 仓库

  2. 区

  3. 订购

  4. 订单行

  5. 股票

  6. 项目

  7. 顾客

  8. 历史

  Pony和SQLAlchemy的数据库是相同的。仅索引主键和外键。小A会自动创建这些索引。在SQLAlchemy中,我手动创建了它。

  在测试过程中,几种虚拟用户将不同类型的事务发送到数据库。每个事务包含几个请求。总共有五种类型的交易以不同的发生概率提交处理:

  交易:

  1. 新订单-45%

  2. 付款-43%

  3. order_status-4%

  4. 交付-4%

  5. 股票水平-4%

  发生交易的可能性与原始TPC-C测试中的相同。

  但是,请记住,由于技术上的限制以及我想测试以下处理器的性能,因此在具有64 GB以上RAM(需要大量处理器和巨大磁盘空间)的服务器上进行了原始TPC-C测试。 ORM而不是硬件抵抗巨大负载的能力,因此此测试有所简化。

  与TPC-C测试的主要区别如下:

  主要区别:

  1. 该测试运行的虚拟用户少于原始测试

  2. 我的测试的表条目较少。例如:原始测试中“库存”关系中的条目数是使用公式100,000 * W计算的,其中W是仓库数。在此测试中为100 *W。

  3. 在TPC-C中,某些事务具有从数据库查询数据的多个选项。例如,在支付交易中,有一种可能性,将通过ID从数据库中请求客户,而另一种则是由姓和名。目前,我的测试仅按ID拨打电话。

  4. 我的测试数据库比TPC-C少一个表。在TPC-C测试中,创建订单后,会将其添加到Order表和NewOrder表中。订单交付后,便从NewOrder表中将其删除。每分钟应用大量事务时,这可以加快工作速度;但是由于我访问数据库的用户较少,所以这是不必要的。相反,在Order表中,我添加了bool属性“ is_o_delivered”,该属性将为False,直到交付订单为止。

  接下来,我将简要描述每个事务的作用。

  交易次数

  新命令

  1. 将两个参数传递给事务:仓库ID和客户ID

  2. 使用传递的ID从数据库中选择仓库和客户

  3. 从数据库中随机选择一个仓库区域

  4. 生成指示订单行数的随机数。

  5. 创建一个Order对象

  6. 循环创建OrderLine对象。在循环的每次迭代中,从项目表中选择一个随机项目

  7. 更改订单中每个项目的库存

  付款

  1. 将两个参数传递给事务:仓库ID和客户ID

  2. 通过传递的ID从数据库中选择仓库和客户

  3. 从数据库中随机选择一个仓库区域

  4. 生成一个指示付款金额的随机数

  5. 按付款金额增加仓库和区域的余额

  6. 客户余额减少付款金额

  7. 递增客户付款柜台

  8. 客户付款金额的总和增加

  9. 创建历史记录对象

  订单状态

  1. 传递客户ID作为交易的参数

  2. 通过ID和该客户的最后订单选择客户

  3. 从订单中获取订单状态和订单行。

  交货

Imagine By Magic Studio
Imagine By Magic Studio

AI图片生成器,用文字制作图片

下载

  1. 传递仓库ID作为交易参数

  2. 从数据库中选择仓库及其所有区域

  3. 为每个地区选择最旧的未交付订单。

  4. 对于每个将交货状态更改为True的订单

  5. 对于每个订单数量递增的客户

  库存水平

  1. 传递仓库ID作为交易参数

  2. 通过ID从数据库中选择仓库

  3. 选择该仓库的最后20个订单

  4. 对于订单中的每个项目,评估项目的库存水平

  检测结果

  有两个ORM参与测试:

  1. SQLAlchemy(图形上的蓝线)

  2. PonyORM(图形上的橙色线)

  以下是通过2个并行进程访问数据库运行测试10分钟的结果。使用“多重处理”模块启动流程。

  X轴-时间(以分钟为单位)

  Y轴-已完成的交易数

  作为DBMS,我使用PostgreSQL

  所有交易

  首先,按照TPC-C测试中的预期,我对所有五个事务进行了测试。这项测试的结果是,小A的速度大约是以前的两倍。

  平均速度:

  · 小A-2543笔交易/分钟

  · SQLAlchemy-1353.4事务/分钟

  之后,我决定分别评估五笔交易中ORM的性能。以下是每笔交易的结果。

  新命令

  平均速度:

  · 小A-3349.2交易/分钟

  · SQLAlchemy-1415.3事务/分钟

  付款

  平均速度:

  · 小A-7175.3事务/分钟

  · SQLAlchemy-4110.6事务/分钟

  订单状态

  平均速度:

  · 小A-16645.6交易/分钟

  · SQLAlchemy-4820.8事务/分钟

  交货

  平均速度:

  · SQLAlchemy-716.9事务/分钟

  · 小A-323.5交易/分钟

  库存水平

  平均速度:

  · 小A-677.3交易/分钟

  · SQLAlchemy-167.9事务/分钟

  测试结果分析

  收到结果后,我分析了为什么会这样,并得出以下结论:

  在5分之4的事务中,PonyORM的速度更快,因为在生成SQL代码时,PonyORM会记住将Python表达式转换为SQL的结果。因此,Pony不会在重复查询时再次转换该表达式,而SQLAlchemy在每次需要执行查询时都被强制生成SQL代码。

  Pony中此类查询的示例:

stocks = select(stock for stock in Stock
  if stock.warehouse == whouse
  and stock.item in items).order_by(Stock.id).for_update()

  生成的SQL: 

 SELECT “stock”.”id”, “stock”.”warehouse”, “stock”.”item”,
  “stock”.”quantity”, “stock”.”ytd”, “stock”.”order_cnt”,
  “stock”.”remote_cnt”, “stock”.”data”FROM “stock” “stock”WHERE “stock”.”warehouse” = %(p1)s
  AND “stock”.”item” IN (%(p2)s, %(p3)s)ORDER BY “stock”.”id”FOR UPDATE
  {‘p1’:7, ‘p2’:7, ‘p3’:37}
  SQLAlchemy:
  stocks = session.query(Stock).filter(
  Stock.warehouse == whouse, Stock.item.in_(
  items)).order_by(text(“id”)).with_for_update()

  生成的SQL: 

SELECT stock.id AS stock_id, stock.warehouse_id AS stock_warehouse_id,
  stock.item_id AS stock_item_id, stock.quantity AS stock_quantity,
  stock.ytd AS stock_ytd, stock.order_cnt AS stock_order_cnt,
  stock.remote_cnt AS stock_remote_cnt, stock.data AS stock_dataFROM stockWHERE stock.warehouse_id = %(warehouse_id_1)s AND stock.item_id IN
  (%(item_id_1)s, %(item_id_2)s) ORDER BY id FOR UPDATE
  {‘warehouse_id_1’: 7, ‘item_id_1’: 53, ‘item_id_2’: 54}

  但是,显然,SQLAlchemy可以更快地执行交付类型事务,因为它可以将应用于不同对象的多个UPDATE操作组合到一个命令中。

  例: 

INFO:www.zpedu.com/sqlalchemy.engine.base.Engine:UPDATE order_line SET delivery_d=%
  (delivery_d)s WHERE order_line.id = %(order_line_id)s
  INFO:sqlalchemy.engine.base.Engine:(
  {‘delivery_d’: datetime.datetime(2020, 4, 6, 14, 33, 6, 922281),
  ‘order_line_id’: 316},
  {‘delivery_d’: datetime.datetime(2020, 4, 6, 14, 33, 6, 922272),
  ‘order_line_id’: 317},
  {‘delivery_d’: datetime.datetime(2020, 4, 6, 14, 33, 6, 922261))

  在这种情况下,小A会为每个更新发送单独的查询。

  结论

  根据测试的结果,我可以说Pony从数据库中选择的速度更快。另一方面,在某些情况下,SQLAlchemy可以以更高的速度生成Update类型的查询。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1134

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2174

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1703

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号