首页 > 解决方案 > 未使用 SQL 数据的最佳实践

问题描述

假设我有数据库,我给用户一条消息,用户可以删除该消息。该表每秒可能有数千个查询。

我读过DELETE语句比 慢UPDATE,我应该考虑到这一点吗?我已经有一个deleted专栏,所以我可以知道消息是否“已删除”。但是,我应该立即执行DELETE声明还是应该每晚删除所有已读消息或使用类似方法?

UPDATE语句应该更快,但是我留下了一堆必须稍后删除的数据,因此数据库的大小不会变得太大

DELETE语句应该更“合乎逻辑”,但是查询太多会不会出现性能问题DELETE

我一次删除所有内容的方法会不会有问题,它会挂起数据库吗?

标签: sql-server

解决方案


我不确定“删除比更新慢”在所有(甚至大多数)情况下都是正确的 - 有很多不同的事情会影响性能。

其次,优化性能需要很多相互关联的权衡——这是一个非常“微观”的决定,它可能根本没有任何影响。或者它可能会将性能挑战转移到堆栈的不同部分或不同的时间点。

第三,这往往是一个“曲棍球棒”问题——根据我的经验,数据库性能一直都很好,直到它迅速恶化,直到你知道恶化的原因,你很可能是在浪费时间或引入额外的复杂性为了一点点奖励。

一般而言,delete from messages where id = $1将与update messages set deleted = 1 where id = $1. 但是,如果您在此表的主键上使用聚集索引,则最终可能会出现很多索引“间隙”,并且重建索引可能会很昂贵。这会影响您的“实时删除”或“软删除后批量删除”策略。

我建议您构建一个性能测试环境,并加载大量虚拟数据;然后,您可以编写性能测试脚本以查看实际问题。


推荐阅读