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

问题描述:

我有一个每60分钟运行一次的进程。在一张桌子上,我需要删除所有数据,然后从不同的表中插入记录。问题是删除并重新插入数据需要很长时间。当表没有数据时,我恐怕用户会看到这个。有没有用户看到这个刷新数据的方法?如何删除所有数据然后插入新数据

+1

更改表名,然后创建新的并插入。 – NEER

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

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

如果你真的想快速的性能,您可以创建第二个表,用数据填充它,然后删除第一个表并将第二个表重命名为第一个表。当你这样做时,你将失去表上的所有权限,因此一定要重新应用重命名表的权限。

如果你想从表中删除所有数据,然后使用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 TA bles“主动 - 被动” - 有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" 
+0

我试过这个,但我有许多与该表相关的外键。所以,我不能删除然后重命名。 – Luke101

+0

@ Luke101 - 你的意思是说那张表对别人有外键?或者这张表有别人使用的主键? –

+0

这是其他人使用的主键表 – Luke101

我会按照下面的方法。当我解决为什么删除和重新插入需要时间。

  1. 创建具有相同数据的新表(t1)为oldtable(maintable
  2. 现在做你的东西上t1
  3. 当你的东西完成后,将t1重命名为maintable

使其基于序列,您在记录中复制的所有记录都有一个序列号(所有记录中都复制相同),另一个文件保存哪个序列处于活动状态,并且您始终选择对此表的联接 - 当您复制新记录时,它们会有一个尚未激活的新序列,当它们全部复制完成时,序列表会更新为新序列 - 冗余序列记录将在您闲暇时删除。

我们假设你的表有加场SeriesNo和表ActiveSeries有场SeriesNo

你的表的所有查询:

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

然后在ActiveSeries更新SeriesNo,使新系列可立即记录。

+1

Andrew,**标点符号**是我们用来阐明含义,问号,感叹号,句号等的符号。请使用它。 – danihp

+0

@danihp - 感谢您提出更明确的建议! – Cato

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