
问题:
不久前,我正在开发一个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. 在每个数据库实例中创建一个简单的测试数据库和一个包含宽列的表。其结构类似于:
自动增量 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 |

有趣的事实

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考试认证体系




