将记录移动到另一个 table 对比 "flag" 列 SQL 性能

Moving records to another table vs. "flag" column SQL performance

假设我有一个table代表"task queue"(数千万条记录)。

任务可以是 "queued" 或 "done"。

如果我们要抓取 10 个任务来处理,哪个性能更好?

请注意,在开始时,我们有几个或 none 个已完成的任务,但随着处理的进行,将有数百万个已完成的任务。

可能没关系,但如果是我,我会用table。这是我的推理:

首先,我们必须假设此 table 上有良好的索引,这将使查找速度更快。有了合适的索引,如果你想查询排队的任务,"done"个任务的数量是10个还是100亿都无关紧要,DBMS只会查看排队的任务。

其次,随着任务从 "queued" 移动到 "done",您将更新其状态。这需要 DBMS 对索引进行一些重组,但没关系,他们已经高效地这样做了大约 30 年了。

如果您要将它们拆分成单独的 table,基本上将记录从一个地方移动到另一个地方的维护将放在 您的代码 上在 DBMS 索引重组代码中。这些代码库中的哪一个经过了更好的测试并且性能更高? :)

最后一个论点——如果你把它全部放在一个大的 table 中,对这些任务的管理进行进一步的性能调整就变成了 DBMS 配置问题,而不是软件开发问题。在我看来,这是一个巨大的胜利。您可以执行各种疯狂的配置来提高任何 DBMS 的性能,包括垂直和水平分区之类的东西。如果您分发数据的方式是通过嵌入在您的软件中的某种方案,那么这些东西将不是选项。

所以底线 - 如果你使用 2 table 方法,我认为它的性能与你使用一个 table 方法非常相似,一旦你考虑到额外的工作您的代码必须做才能移动记录。如果您从一个 table 中删除一个 "open" 任务并将其粘贴到 "done" table 中,请记住 DBMS 仍然必须更新 "open" 索引在来源 table 上。因为可能不会有很大的性能差异,所以您应该使用一种 table 方法,因为它对您来说工作更少,并且以后会为您提供更大的灵活性(通过配置提高速度,副软件)