我想从百万+行表中删除大约90%的行。我可以做些什么来加快速度?例如如果我打开简单恢复模式会有帮助吗?
答案 0 :(得分:8)
使用select into将您不想删除的行复制到临时表中,然后使用truncate表而不是删除。将行复制回旧表。请先记得drop contraints。
如果您有标识列,则在重新输入数据后,请使用类似的内容重新设置表格。
declare @seed int
select @seed = max(identity_col)+1 from tableName
DBCC CHECKIDENT (orders, table_name, @seed)
答案 1 :(得分:2)
鉴于您要删除90%的行,SELECT INTO要保留在新表中的10%行可能是最快的。
答案 2 :(得分:1)
如果您无法将其余表复制到另一个表,则截断并复制回来......
...丢弃索引是你唯一可以编程的东西。在这种情况下,删除索引并重新创建它们可能有所帮助。
...或获得更快的光盘子系统,主要用于数据。
恢复模式无济于事 - 恢复模式表示日志可以在(可以隐式)提交后立即删除,但其中没有任何内容可以避免日志条目被写入。
答案 3 :(得分:1)
添加IsDeleted (BIT)
标记,为那些90%设置为1,并在表格上创建一个仅显示IsDeleted=0
行的视图。
删除总是a)资源密集型操作,b)破坏任何可能的责任 - 我会尽可能地避免它,原因包括两个(性能和数据破坏)。改为使用“软删除”方法。