如何删除所有数据然后插入新数据

时间:2016-07-27 13:30:01

标签: sql sql-server sql-server-2014

我有一个每60分钟运行一次的流程。在一个表上,我需要删除所有数据,然后从不同的表中插入记录。问题是删除和重新插入数据需要很长时间。当表没有数据时,我担心用户会看到这个。有没有办法在没有用户看到这个的情况下刷新数据?

5 个答案:

答案 0 :(得分:2)

如果您要从表中删除所有数据,请使用TRUNCATE TABLE代替delete - 它会更快地完成。

至于插页,有点难以说,因为你没有提供任何细节,但你可以尝试的是:

  • 选项1 - 使用临时表
create table table_temp as select * from original_table where rownum < 1;
//insert into table_temp

drop table original_table;
Exec sp_rename 'table_temp' , 'original_table'
  • 选项2 - 使用2个表“主动 - 被动” - 有2个数据表和一个选择它们的视图。视图将与第三个表连接,该表将指定要从哪个表中进行选择。一种“主动 - 被动”的概念。 为了证明这个概念:
with active_table as ( select 'table1_active' active_table )

select 1 data     
where 'table1_active' in (select * from active_table)

union all     
select 2  
where 'table2_active' in (select * from active_table)

//This returns only one record with the "1"

答案 1 :(得分:0)

您是截断而不是删除?截断(记录时)比删除快得多。

如果你不能截断尝试一次删除1000-10000行(较小的日志累积和删除大量行的速度大大增加。)

如果您真的想要快速性能,可以创建第二个表,用数据填充它,然后删除第一个表并将第二个表重命名为第一个表。执行此操作时,您将失去对表的所有权限,因此请务必重新应用重命名表的权限。

答案 2 :(得分:0)

我会遵循以下方法。我在解决为什么删除和重新插入需要时间。

  1. 创建一个与旧表(t1
  2. 具有相同数据的新表(maintable
  3. 现在在t1上完成你的工作。
  4. 完成您的工作后,将t1重命名为maintable

答案 3 :(得分:0)

使它基于序列,你复制的记录都有一个序列号(对于记录中的所有复制都是相同的)而另一个文件保存哪个序列是活动的,你总是选择加入这个表 - 当你在新记录中复制它们有一个尚未激活的新序列,当它们全部被复制时,序列表将更新为新序列 - 冗余序列记录将在您闲暇时被删除。

示例

我们假设您的表格已添加字段SeriesNo,而表格ActiveSeries包含字段SeriesNo

您桌子的所有查询:

SELECT * 
FROM YourTable Y 
JOIN ActiveSeries A 
       ON A.SeriesNo = Y.SeriesNo

然后更新SeriesNo中的ActiveSeries即可立即提供新系列记录。

答案 4 :(得分:0)

如果要删除表中的所有行,可以考虑对表使用TRUNCATE语句而不是DELETE。它将加快您的部分流程。请记住,这将重置您在桌面上可能拥有的任何身份种子。 如建议的那样,您可以将此流程包装在事务中,并根据您设置事务隔离级别的方式,控制用户在事务期间查询数据时将看到的内容。