我有一个每60分钟运行一次的流程。在一个表上,我需要删除所有数据,然后从不同的表中插入记录。问题是删除和重新插入数据需要很长时间。当表没有数据时,我担心用户会看到这个。有没有办法在没有用户看到这个的情况下刷新数据?
答案 0 :(得分:2)
如果您要从表中删除所有数据,请使用TRUNCATE
TABLE
代替delete
- 它会更快地完成。
至于插页,有点难以说,因为你没有提供任何细节,但你可以尝试的是:
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'
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)
我会遵循以下方法。我在解决为什么删除和重新插入需要时间。
t1
)maintable
)
t1
上完成你的工作。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。它将加快您的部分流程。请记住,这将重置您在桌面上可能拥有的任何身份种子。 如建议的那样,您可以将此流程包装在事务中,并根据您设置事务隔离级别的方式,控制用户在事务期间查询数据时将看到的内容。