暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server vs MySQL vs PostgreSQL 删除性能比较

问题:


不久前,我正在开发一个SQL Server数据库,它增长很快,占用了大量的磁盘空间。在进行初步检查之后,我注意到最大表中的记录数量并不是那么多(只有大约150,000条),数据库的大小略高于100GB。大表只包含2列、一个ID和一个非常宽的VARBINARY字段(就每行中存储的数据量而言)。最终,我不得不想出一种策略,将旧信息以块的形式清除,因为单个删除可能会导致阻塞和其他潜在问题。

我有足够的好奇去尝试,并将分享我的结果。我希望你觉得这和我做测试时一样有趣。


解决方案


在这个技术中,我将展示我在每个 RDBMS 中执行记录删除后编译的结果。测试将针对只有一个 id 列和一个宽字符串(准确地说是 1,000,000 个字符)的表中的一组 10,000 条记录进行。




初步考虑





您可能已经从本文的标题中猜到了,我正在针对 SQL Server、MySQL 和 PostgreSQL 数据库实例执行测试。为了尽可能公平,我在具有完全相同规格的 Linux 虚拟机中执行每个测试;对于wide的数据类型,我尽量选择它们之间尽可能同源的东西。RDBMS 设置的最后一个细节是,我一安装就用地测试了它们,没有任何最佳实践、调整或特定参数设置来帮助提高性能。


虚拟机规格

操作系统:Ubuntu Server 20.04 LTS

CPU:       英特尔酷睿 i7 2.7GHz (3820QM)

内存:       8GB DDR3 1600MHz

卷大小:    25GB


与 RDBMS 及其各自运行相关的信息,我使用了每种产品的最新可用版本,以尽可能保持公平。



测试场景是这样的




 

1. 在每个数据库实例中创建一个简单的测试数据库和一个包含宽列的表。其结构类似于:

CREATE TABLE test( 
**id INT NOT NULL PRIMARY KEYAUTOINCREMENT,
***wide VARCHAR(MAX)NOT NULL )

自动增量 id 的语法在每个 RDBMS 中都不同,但这只是为了给您一个例子。

wide的数据类型在所有 RDBMS 中并不完全相同,但我尝试为每个 RDBMS 选择一个,以便我在每个 RDBMS 中存储完全相同的数据,以保持尽可能相似。


2. 插入一轮 10,000 条记录,并执行以下轮次删除:

Time todelete 1,000 rows, as well as the size of the respective transaction log fileafter its completion. Time to delete 2,000 rows, as well as the size of therespective transaction log file after its completion. Time to delete 3,000rows, as well as the size of the respective transaction log file after itscompletion. Time to delete 4,000 rows, as well as the size of the respectivetransaction log file after its completion. Time to delete 5,000 rows, as wellas the size of the respective transaction log file after its completion. Timeto delete 10,000 rows, as well as the size of the respective transaction logfile after its completion.


3. 我在每行的wide中插入一个 1,000,000 个字符长的字符串(在所有行中完全相同),我将其作为示例附加,以防您想在您的系统中尝试它。


4. 对于每个 RDBM 中的测试,我确保只有那个 RDBMS 在 VM 中运行,而其他两个完全关闭。


插入


这些指标是在每个案例的完全空实例上测量的。 

RDBMS

版本

wide数据类型

插入 10,000 条记录的时间

插入后数据文件的大小

SQL Server

2019 CU6

VARCHAR(MAX)

18分25秒

9,864MB

MySQL

8.0.21

LONGTEXT

13分15秒

9251.52MB

PostgreSQL

12.2

VARCHAR(1000000)

4分20秒

147MB


删除


在每轮删除之后,日志文件在下一轮发生之前被清理/擦除。对于每个示例,都有一个图表进行比较,以便更好地了解结果。请注意,我仅出于可视化目的将时间结果乘以 10。




1000 条记录删除测试




 

RDBMS

删除记录的时间

删除后的日志大小文件

SQL Server

44秒

72MB

MySQL

13.8秒

954MB

PostgreSQL

0.095秒

16MB

 


 


2000 条记录删除测试





RDBMS

删除记录的时间

删除后的日志大小文件

SQL Server

1分2秒

136MB

MySQL

29.24秒

1.9GB

PostgreSQL

0.179秒

16MB

 




3000 条记录删除测试




 

RDBMS

删除记录的时间

删除后的日志大小文件

SQL Server

50秒

200MB

MySQL

2分32秒

2.8GB

PostgreSQL

0.264秒

16MB

 





4000 条记录删除测试




 

RDBMS

删除记录的时间

删除后的日志大小文件

SQL Server

1分36秒

264MB

MySQL

3分43秒

3.7GB

PostgreSQL

0.134秒

16MB

 



5000 条记录删除测试




 

RDBMS

删除记录的时间

删除后的日志大小文件

SQL Server

2分25秒

355MB

MySQL

5分44秒

4.6GB

PostgreSQL

0.314秒

16MB




10000 条记录删除测试




 

RDBMS

删除记录的时间

删除后的日志大小文件

SQL Server

3分53秒

648MB

MySQL

10分51秒

12GB

PostgreSQL

0.639 秒

16MB

 




有趣的事实





1. 毫无疑问,PostgreSQL 是这次实验的明显赢家。在 3 个 RDBMS 中,它在最短的时间内完成插入和删除操作,同时保持事务日志更小。很可能pg_wal 文件的事务日志管理和检查点机制得到了很好的实现,或者幕后还有其他我不知道的东西(因为我现在不是PostgreSQL 专家)。
2. 与SQL Server 相比,MySQL 在前 2,000 条记录内执行删除的时间具有优势。但是,在流程的每个阶段,都会对最终达到顶峰的事务日志大小造成重大影响。
3. 在应用最佳实践并正确调整每个 RDBMS 以查看是否获得更好的数字后,执行完全相同的实验会很有趣。虽然,我想这对PostgreSQL 来说有点毫无意义,因为我认为我不会得到比我已经得到的更好的数字。
4. 在 RDBMS 的世界里,我一直听说 PostgreSQL 比 MySQL 好得多。我从来没有在高度事务性的生产环境中使用过 PostgreSQL,但是在看到这个实验的结果后,我想我可以找到一些真相。
5.  我知道这样一个事实,在 SQL Server 中按块管理像这样的删除操作在事务日志使用方面表现得更好。此外,表上的锁更加宽松,即使正在删除,它也允许您与表交互,这在较大的删除中不会发生。
6. 如果您必须在真实的生产系统中执行类似的操作并且您正在使用 MySQL,我想必须应用深思熟虑的策略。当然,先进行几次试运行才能看到结果。
7. 将更多的 RDBMS 加入 Oracle、DB2之类的组合中,或者跨入 NoSQL 领域并抛弃 MongoDB、Cassandra、Redis 等,这会很有趣。

原文链接:
https://www.mssqltips.com/sqlservertip/6607/delete-sql-performance-for-sql-server-mysql-and-postgresql/


PG考试咨询

往期回顾

永远都不晚:PostgreSQL认证专家(培训考试-广州站)

PGCCC,公众号:PostgreSQL考试认证中心永远都不晚:PostgreSQL认证专家(培训考试-广州站)

PostgreSQL-PCP认证专家-上海站、广州站

PGCCC,公众号:PostgreSQL考试认证中心开班通知-PCP认证专家(上海站)培训开班1106

PostgreSQL-PCP认证专家-北京站-精彩花絮

PGCCC,公众号:PostgreSQL考试认证中心PostgreSQL认证专家考试(培训)(10月16日北京站)精彩花絮

PostgreSQL-PCP认证专家-成都站

公众号:PostgreSQL考试认证中心开班通知-PCP认证专家(成都站)培训开班1016

PostgreSQL-PCP认证专家考试-北京站-考试风采

PGCCC,公众号:PostgreSQL考试认证中心PostgreSQL认证专家考试(培训)-北京站-成功举办

PostgreSQL-PCA认证考试-贵阳站-考试风采

PGCCC,公众号:PostgreSQL考试认证中心PostgreSQL PCA+PCP认证考试在贵阳成功举办

PostgreSQL-PCP认证专家考试-上海站-考试风采

PGCCC,公众号:PostgreSQL考试认证中心PostgreSQL PCP认证考试(上海站)成功举办

PostgreSQL认证专家考试-学员考试总结

薛晓刚,公众号:PostgreSQL考试认证中心难考的PostgreSQL认证考试

PostgreSQL-PCM认证大师考试-天津站-考试风采

PGCCC,公众号:PostgreSQL考试认证中心PostgreSQL-PCM认证大师考试(天津站)成功举办

如何在工业和信息化部教育与考试中心官网查询证书

PG考试认证中心,公众号:PostgreSQL考试认证中心如何在工业和信息化部教育与考试中心查询PostgreSQL证书

中国PostgreSQL考试认证体系

PG考试认证中心,公众号:PostgreSQL考试认证中心中国PostgreSQL考试认证体系

文章转载自PostgreSQL考试认证中心,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论