回答

收藏

将记录移到另一个表与“滞后”列的SQL性能

技术问答 技术问答 204 人阅读 | 0 人回复 | 2023-09-14

假设我有一个表代表“任务队列”(几千万条记录)。8 ^& X! d3 U" y
任务可以“排队”或“完成”。+ |$ C1 Q; p3 p
如果我们要处理10个任务,哪个执行得更好?4 P1 t. G, s& M; c7 E/ ]" T
以“标志”列单表像ENUM/ BIT/TINYINT标记任务为已完成或没有(最终指数列)
7 _" O( n# ^" \* P0 Q9 E$ h单独的表用于排队的任务和已完成的任务,并将每个已完成的任务从插入到已完成的已排队队列中删除
1 S! }( \0 h2 F& K; Y& q
9 ?4 G9 @7 h5 V/ s2 v+ d
请注意,一开始,我们只有很少或没有完成的任务,但是随着处理的进行,将有数以百万计的已经完成的任务。
. h; X( M8 m/ C# K% A" q. g                ) N( e" S, o" m( \+ H
解决方案:: w5 M" _8 |; J7 S
               
2 Q, S6 N  e& ^/ Y4 H. c& o+ Z7 M/ P' }4 N0 r0 h& @/ I) ?

0 q' v" `, I( K2 q/ u& v                可能没关系,但是如果是我,我将使用一张桌子。这是我的理由:
( H' z: h9 G/ ~# r, Y! X6 O首先,我们必须在此表上假设良好的索引,这将使查找快速。使用适当的索引,如果要查询排队的任务,“完成”任务的数量是10还是100亿都无关紧要,DBMS只会查看排队的任务。$ K$ G& J0 d4 C. V& S0 w  N3 L
其次,随着任务从“排队”移动到“完成”,您将要更新其状态。这需要DBMS对索引进行一些重组,但是没关系,他们已经高效地执行了30多年了。/ L! q8 B! M( ]  C
如果将它们分成单独的表,则将记录从一个位置移动到另一位置的维护工作基本上将放在 代码中,8 B! v; ]& Z6 ?
而不是在DBMS索引重组代码中。哪些代码库经过了更好的测试且性能更高?9 D. a# I. _, A, r% `
最后一个论点-9 a5 F2 i5 c1 C
如果将它们全部放在一个大表中,则对这些任务的管理进行进一步的性能调整将成为DBMS配置问题,而不是软件开发问题。那是我书中的一大胜利。您可以采取各种疯狂的配置工作来提高任何DBMS的性能,包括垂直和水平分区。如果您通过软件中嵌入的某种方案分配数据的方式,那么这些事情就不会成为选择。# s# c  d# ^/ [2 A
因此,最重要的是-
- E- Z: o+ T, N7 {如果您使用2表方法,那么我认为它的性能将与您使用单表方法非常相似,一旦考虑到额外的工作,您的代码将需要执行一些工作来移动记录。如果从一个表中删除“打开”任务并将其粘贴到“完成”表中,请记住,DBMS仍将必须更新源表上的“打开”索引。因为可能不会有很大的性能差异,所以应该使用一个表的方法,因为它对您的工作较少,并且以后为您提供了更大的灵活性(通过配置和副软件来提高速度)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则