sql-server - 未使用 SQL 数据的最佳实践
问题描述
假设我有数据库,我给用户一条消息,用户可以删除该消息。该表每秒可能有数千个查询。
我读过DELETE
语句比 慢UPDATE
,我应该考虑到这一点吗?我已经有一个deleted
专栏,所以我可以知道消息是否“已删除”。但是,我应该立即执行DELETE
声明还是应该每晚删除所有已读消息或使用类似方法?
UPDATE
语句应该更快,但是我留下了一堆必须稍后删除的数据,因此数据库的大小不会变得太大
DELETE
语句应该更“合乎逻辑”,但是查询太多会不会出现性能问题DELETE
?
我一次删除所有内容的方法会不会有问题,它会挂起数据库吗?
解决方案
我不确定“删除比更新慢”在所有(甚至大多数)情况下都是正确的 - 有很多不同的事情会影响性能。
其次,优化性能需要很多相互关联的权衡——这是一个非常“微观”的决定,它可能根本没有任何影响。或者它可能会将性能挑战转移到堆栈的不同部分或不同的时间点。
第三,这往往是一个“曲棍球棒”问题——根据我的经验,数据库性能一直都很好,直到它迅速恶化,直到你知道恶化的原因,你很可能是在浪费时间或引入额外的复杂性为了一点点奖励。
一般而言,delete from messages where id = $1
将与update messages set deleted = 1 where id = $1
. 但是,如果您在此表的主键上使用聚集索引,则最终可能会出现很多索引“间隙”,并且重建索引可能会很昂贵。这会影响您的“实时删除”或“软删除后批量删除”策略。
我建议您构建一个性能测试环境,并加载大量虚拟数据;然后,您可以编写性能测试脚本以查看实际问题。
推荐阅读
- java - Ambari 2.7.5 在 CentOS 7 上安装失败
- android - Random document that doesnt exist in firestore gets selected on android and deleted
- java - 一些 api 调用在 Android 9 上失败
- javascript - 异步箭头函数的 onclick 语法是否仅适用于 Id?
- postgresql - postgresql 并发事务
- c# - 为什么结构中的只读成员而不是类中的成员
- powershell - Powershell 在过去 6 个月内禁用 AD 用户?
- java - 如何解决在索引0处转换参数的代码问题抛出错误;
- python - 如何使用 Python 创建分层的熊猫数据框?
- jolt - 复杂 JSON 转换的 Jolt