如何删除所有数据然后插入新数据
我有一个每60分钟运行一次的进程。在一张桌子上,我需要删除所有数据,然后从不同的表中插入记录。问题是删除并重新插入数据需要很长时间。当表没有数据时,我恐怕用户会看到这个。有没有用户看到这个刷新数据的方法?如何删除所有数据然后插入新数据
你是截断而不是删除?截断(记录时)比删除要快得多。
如果您不能截断尝试一次删除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"
我会按照下面的方法。当我解决为什么删除和重新插入需要时间。
- 创建具有相同数据的新表(
t1
)为oldtable(maintable
) - 现在做你的东西上
t1
。 - 当你的东西完成后,将
t1
重命名为maintable
。
使其基于序列,您在记录中复制的所有记录都有一个序列号(所有记录中都复制相同),另一个文件保存哪个序列处于活动状态,并且您始终选择对此表的联接 - 当您复制新记录时,它们会有一个尚未激活的新序列,当它们全部复制完成时,序列表会更新为新序列 - 冗余序列记录将在您闲暇时删除。
例
我们假设你的表有加场SeriesNo
和表ActiveSeries
有场SeriesNo
。
你的表的所有查询:
SELECT *
FROM YourTable Y
JOIN ActiveSeries A
ON A.SeriesNo = Y.SeriesNo
然后在ActiveSeries
更新SeriesNo
,使新系列可立即记录。
如果您要删除表中的所有行,则可以考虑对表使用TRUNCATE语句而不是DELETE。它会加快你的过程的一部分。请记住,这将重置您桌上可能拥有的任何身份种子。 正如所建议的,您可以将此过程包装在事务中,并根据您设置事务隔离级别的方式,您可以控制用户在事务过程中查询数据时将看到的内容。
更改表名,然后创建新的并插入。 – NEER