概述 我在SQL Server 2008 R2中有一个表(EODBalances),它有很大的行数(~2亿)。基本上它是在一个会计系统(总账)中,它的作用是为会计系统中的每个账户存储期末余额。从SQL Server表中删除重复行的更简单,更有效的方法
表定义
[EodBalances](
[EodBalanceId] [int] IDENTITY(1,1) NOT NULL,
[AccountId] [int] NOT NULL,
[Created] [datetime] NOT NULL,
[Balance] [decimal](19, 4) NOT NULL,
[RowVersion] [timestamp] NOT NULL
账户的#是成倍的增长,从而导致在EODBalances表中的行#以同样增长的任务。除了指数增长之外,现有问题之一是,即使账户余额没有变化,我们每天都会为每个账户添加一个新行。我的任务是通过删除每个帐户的重复行来减少此表中的行数。我重构了每天晚上更新此表的存储过程,以便只在余额发生变化时才添加新行。这当然只会在未来发生。
问题 我面临的任务是清理表中的历史行,这是与重复删除相关的特定类型的问题。我需要保留表中任何账户余额的原始(第一)条目,但删除期末余额不变的后续行。只要它发生变化,我需要保留该特定行,然后再次删除后续行,直到它再次发生变化。等等...
我已经尝试了几种不同的方法来实现这一点,但他们都是非常低效的,除了他们需要运行的时间,有像海量日志文件的副作用(这是一种痛苦当数据库被日志出货时)。我现在的解决方案是创建表的副本,并将要保留的行复制到原始表中并将其删除。完成此操作后,我删除原始表并将该副本重命名为原始名称。这可行,但比我在升级窗口中可用的时间要多。
有没有人有类似的问题,并找到一个更好的方式来处理它?
从巨大的表中删除行非常耗时。我不知道你是否尝试过使用分区。如果没有,我建议你以适当的方式对表进行分区,然后在每个不同的分区上进行更新和删除数据。你需要使用分区切换技术。搜索它 – FLICKER
未来“重新设计”工作的好主意 - 但我最近发现分区只能在企业SQL *服务器中使用,并不是我们所有人都为此而感到幸运。 – PaulG