2016-07-27 51 views
0

我有一個每60分鐘運行一次的進程。在一張桌子上,我需要刪除所有數據,然後從不同的表中插入記錄。問題是刪除並重新插入數據需要很長時間。當表沒有數據時,我恐怕用戶會看到這個。有沒有用戶看到這個刷新數據的方法?如何刪除所有數據然後插入新數據

+1

更改表名,然後創建新的並插入。 – NEER

回答

0

你是截斷而不是刪除?截斷(記錄時)比刪除要快得多。

如果您不能截斷嘗試一次刪除1000-10000行(較小的日誌積累和刪除大量行的速度大幅增加。)

如果你真的想快速的性能,您可以創建第二個表,用數據填充它,然後刪除第一個表並將第二個表重命名爲第一個表。當你這樣做時,你將失去表上的所有權限,因此一定要重新應用重命名錶的權限。

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 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

0

我會按照下面的方法。當我解決爲什麼刪除和重新插入需要時間。

  1. 創建具有相同數據的新表(t1)爲oldtable(maintable
  2. 現在做你的東西上t1
  3. 當你的東西完成後,將t1重命名爲maintable
0

使其基於序列,您在記錄中複製的所有記錄都有一個序列號(所有記錄中都複製相同),另一個文件保存哪個序列處於活動狀態,並且您始終選擇對此表的聯接 - 當您複製新記錄時,它們會有一個尚未激活的新序列,當它們全部複製完成時,序列表會更新爲新序列 - 冗餘序列記錄將在您閒暇時刪除。

我們假設你的表有加場SeriesNo和表ActiveSeries有場SeriesNo

你的表的所有查詢:

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

然後在ActiveSeries更新SeriesNo,使新系列可立即記錄。

+1

Andrew,**標點符號**是我們用來闡明含義,問號,感嘆號,句號等的符號。請使用它。 – danihp

+0

@danihp - 感謝您提出更明確的建議! – Cato

0

如果您要刪除表中的所有行,則可以考慮對錶使用TRUNCATE語句而不是DELETE。它會加快你的過程的一部分。請記住,這將重置您桌上可能擁有的任何身份種子。 正如所建議的,您可以將此過程包裝在事務中,並根據您設置事務隔離級別的方式,您可以控制用戶在事務過程中查詢數據時將看到的內容。

相關問題